问题
调用dayjs()
会得到一个正确的日期,但会偏离两个小时。由于某种原因,dayjs()
似乎被设置为错误的时区(GMT),而我的实际时区是GMT+2。
预期
Mon, 09 Aug 2021 17:45:55 GMT+2
实际
Mon, 09 Aug 2021 15:45:55 GMT
我尝试过的
我试着用时区插件设置我的时区,但似乎不起作用:
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs().tz('Europe/Berlin'); // unchanged Mon, 09 Aug 2021 15:45:55 GMT
我使用的是Ubuntu 20.04.2 LTS,所以我检查了:
$ timedatectl
Local time: Mo 2021-08-09 17:45:55 CEST
Universal time: Mo 2021-08-09 15:45:55 UTC
RTC time: Mo 2021-08-09 17:45:55
Time zone: Europe/Berlin (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: yes
Warning: The system is configured to read the RTC time in the local time zone.
This mode cannot be fully supported. It will create various problems
with time zone changes and daylight saving time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
If at all possible, use RTC in UTC by calling
'timedatectl set-local-rtc 0'.
我是用TypeScript编码的,所以我也检查了创建Date
对象是否也会导致错误的时间,但没有:
const time = new Date(); // results in correct time
TL;DR
dayjs()
在GMT,但应该在GMT+2。为什么?
简单地使用utc插件而不使用时区插件不知何故达到了预期效果。
import utc from 'dayjs/plugin/utc';
day.extend(utc);
dayjs.utc(); // results in date in correct timezone
import utc from 'dayjs/plugin/utc'; import timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); dayjs.tz.setDefault('Europe/Berlin');
您应该试试这种方法。然而,请注意,它只影响dayjs.tz("某个日期"),dayjs()仍然会显示您的当地时间。
这对我来说很有效。
dayjs('2021-08-09 15:45:55 UTC').tz("Africa/Lagos")
响应
{
'$L': 'en',
'$offset': 60,
'$d': 2021-08-09T15:45:55.000Z,
'$x': { '$timezone': 'Africa/Lagos' },
'$y': 2021,
'$M': 7,
'$D': 9,
'$W': 1,
'$H': 16,
'$m': 45,
'$s': 55,
'$ms': 0
}
您可以创建这样的服务
// Filename : dayjs.ts
import dayjs from "dayjs";
import utc from "dayjs/plugin/utc";
import timezone from "dayjs/plugin/timezone";
import "dayjs/locale/fr";
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.locale("fr");
dayjs.tz.setDefault("Europe/Paris")
const timezonedDayjs = (...args: any[]) => {
return dayjs(...args).tz();
};
const timezonedUnix = (value: number) => {
return dayjs.unix(value).tz();
};
timezonedDayjs.unix = timezonedUnix;
timezonedDayjs.duration = dayjs.duration;
export default timezonedDayjs;
并将您的导入从import dayjs from "dayjs"
更改为import dayjs from "my-service/dayjs"
有了这个,打字甚至可以使用插件