【问题标题】:Intl.DateTimeFormat() returns incorrect date for UTCIntl.DateTimeFormat() 为 UTC 返回不正确的日期
【发布时间】:2019-05-01 14:54:22
【问题描述】:

我关注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 PM' 等于 '2019 年 5 月 18 日星期六 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 仍然是下午 4 点(16:00)Europe/London。重要的是我以 ISO 格式准确传递日期。

当我从日期末尾删除Z(这是 ISO 规范允许的)时,我得到了正确的结果 (16:00)。但是,我想保留Zulu 时间指示器,因为这是我的数据库当前存储日期时间的方式。

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

还有什么可以解释我为什么会出现这种差异或我错过了什么?

【问题讨论】:

    标签: javascript datetime time datetime-format


    【解决方案1】:

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

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

    2019 年 5 月 18 日星期六 17:00

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

    2019 年 1 月 18 日星期五 16:00

    注意时间分量的差异。所以测试失败了。

    【讨论】:

    • 对,所以大概我应该在我的测试中假设两种情况:一种是夏季时间,另一种是标准时间。我找不到一个名为 Europe/Greenwich 的区域来获得始终相同的结果 - 但似乎我不应该显示 UTC,而是显示用户定义的区域。
    • 是的 2 个测试用例听起来很合理。是的,如果您总是想要相同的结果,它应该是 UTC,但用户时区可能更相关,具体取决于您的应用程序是否应该以 UTC 或浏览器时区显示时间。这实际上取决于要求,某些数据(如日志数据)在 UTC 中可能会更好
    猜你喜欢
    • 2015-12-14
    • 2020-02-16
    • 2018-10-19
    • 2014-09-13
    • 2018-12-08
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多