dayjs()在错误的时区



问题

调用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"

有了这个,打字甚至可以使用插件

相关内容

  • 没有找到相关文章

最新更新