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

时间:2019-05-01 14:54:22

标签: 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的{​​{1}}仍然是下午4点(16:00)。我必须以ISO格式精确地输入日期,这一点很重要。

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

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

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

1 个答案:

答案 0 :(得分:1)

British Summer Time的运行时间为三月到十月,对于该时间段的日期,如果使用“欧洲/伦敦”时区显示,则比格林威治标准时间早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

请注意时间部分的差异。因此测试正确失败了。