Intl.DateTimeFormat() returns UTC 日期不正确
Intl.DateTimeFormat() returns incorrect date for UTC
我关注https://devhints.io/wip/intl-datetime
我正在做一个测试:
const text = Utils.dateToText('2019-05-18T16:00:00Z', 'en-GB')
expect(text).to.equal('Saturday, May 18, 2019, 16:00')
和一个函数:
dateToText(dateTime: string, lang: string[5]): string {
const date = new Date(dateTime)
let format = {
timeZone: 'Europe/London',
day: '2-digit',
month: 'long',
year: 'numeric',
weekday: 'long',
hour: '2-digit',
minute: '2-digit',
hour12: false
}
return new Intl.DateTimeFormat(lang, format).format(date)
}
测试失败:
AssertionError:预期 'Saturday, May 18, 2019, 17:00 PM' 等于 'Saturday, May 18, 2019, 16:00 PM'(+ 预期 - 实际)
-Saturday, May 18, 2019, 17:00
+Saturday, May 18, 2019, 16:00
所以根据https://en.wikipedia.org/wiki/ISO_8601日期规范,Z
是格林威治时区祖鲁语的符号。然后我希望 2019-05-18T16:00:00Z
仍然是 Europe/London
的下午 4 点(16:00)。以 ISO 格式准确传递日期很重要。
当我从日期末尾删除 Z
时(ISO 规范允许),我得到了正确的结果 (16:00)。但是,我想保留 Zulu
时间指示器,因为这是我的数据库当前存储日期时间的方式。
在我的本地机器上,我在 Europe/London 时区。在我的另一台机器上,测试正确通过,但是,在 Gitlab CI 上它会抛出错误。这显然与时区有关...
还有什么可以解释为什么我得到这种差异或我错过了什么?
British Summer Time 从 3 月到 10 月运行,对于这段时间的日期,如果使用 'Europe/London' 时区显示,它们将比格林威治标准时间早 1 小时。
所以 Utils.dateToText('2019-05-18T16:00:00Z', 'en-GB')
(夏令时)正确 returns
Saturday, 18 May 2019, 17:00
虽然 Utils.dateToText('2019-01-18T16:00:00Z', 'en-GB')
(标准时间)正确 returns
Friday, 18 January 2019, 16:00
注意时间部分的差异。所以测试正确地失败了。
我关注https://devhints.io/wip/intl-datetime
我正在做一个测试:
const text = Utils.dateToText('2019-05-18T16:00:00Z', 'en-GB')
expect(text).to.equal('Saturday, May 18, 2019, 16:00')
和一个函数:
dateToText(dateTime: string, lang: string[5]): string {
const date = new Date(dateTime)
let format = {
timeZone: 'Europe/London',
day: '2-digit',
month: 'long',
year: 'numeric',
weekday: 'long',
hour: '2-digit',
minute: '2-digit',
hour12: false
}
return new Intl.DateTimeFormat(lang, format).format(date)
}
测试失败:
AssertionError:预期 'Saturday, May 18, 2019, 17:00 PM' 等于 'Saturday, May 18, 2019, 16:00 PM'(+ 预期 - 实际)
-Saturday, May 18, 2019, 17:00
+Saturday, May 18, 2019, 16:00
所以根据https://en.wikipedia.org/wiki/ISO_8601日期规范,Z
是格林威治时区祖鲁语的符号。然后我希望 2019-05-18T16:00:00Z
仍然是 Europe/London
的下午 4 点(16:00)。以 ISO 格式准确传递日期很重要。
当我从日期末尾删除 Z
时(ISO 规范允许),我得到了正确的结果 (16:00)。但是,我想保留 Zulu
时间指示器,因为这是我的数据库当前存储日期时间的方式。
在我的本地机器上,我在 Europe/London 时区。在我的另一台机器上,测试正确通过,但是,在 Gitlab CI 上它会抛出错误。这显然与时区有关...
还有什么可以解释为什么我得到这种差异或我错过了什么?
British Summer Time 从 3 月到 10 月运行,对于这段时间的日期,如果使用 'Europe/London' 时区显示,它们将比格林威治标准时间早 1 小时。
所以 Utils.dateToText('2019-05-18T16:00:00Z', 'en-GB')
(夏令时)正确 returns
Saturday, 18 May 2019, 17:00
虽然 Utils.dateToText('2019-01-18T16:00:00Z', 'en-GB')
(标准时间)正确 returns
Friday, 18 January 2019, 16:00
注意时间部分的差异。所以测试正确地失败了。