javascript - Intl.DateTimeFormat() 返回不正确的 UTC 日期

标签 javascript datetime time datetime-format

我正在关注 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:预期'2019 年 5 月 18 日,星期六,下午 17:00' 等于 '2019 年 5 月 18 日,星期六,下午 16:00'(+预期 - 实际)

  -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 时间指示器,因为这是我的数据库当前存储 DateTime 的方式。

在我的本地机器上,我在欧洲/伦敦时区。在我的另一台机器上,测试正确通过,但是,在 Gitlab CI 上它抛出错误。这显然与时区有关...

还有什么可以解释为什么我得到这种差异或我错过了什么?

最佳答案

British Summer Time从 3 月到 10 月运行,对于这段时间的日期,如果使用“欧洲/伦敦”时区显示,它们将比格林威治标准时间早 1 小时。

因此 Utils.dateToText('2019-05-18T16:00:00Z', 'en-GB')(夏令时)正确返回

Saturday, 18 May 2019, 17:00

虽然 Utils.dateToText('2019-01-18T16:00:00Z', 'en-GB')(标准时间)正确返回

Friday, 18 January 2019, 16:00

注意时间部分的差异。所以测试正确地失败了。

关于javascript - Intl.DateTimeFormat() 返回不正确的 UTC 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55938200/

相关文章:

javascript - 使用 JavaScript 或 jQuery 更改 CSS 规则

javascript - javascript 以小时和分钟为单位格式化时间

python - 如何在 Python 中获取 "timezone aware"的 datetime.today() 值?

PHP 商店营业时间晚上

pandas - 按 datetime64 中没有日期的时间过滤

javascript - 正则表达式捕获所有内容,包括两个模式之间的新行

javascript - 将 Kendo UI 网格高度设置为包装器的 100%

c# - 使用 CultureInfo 时 DateTime.Parse 返回错误值

php - PHP 中的日期时间格式

javascript - 如何使用opencv4node.js设置矩阵区域