日期差异根据时区而变化

时间:2019-05-22 09:10:47

标签: javascript timezone momentjs

我有一个服务器日期时间(也是CST)和一个基于芝加哥时区的日期,当我发现两个日期之间的差异时,该值对于不同的时区是不同的。

我无法解决问题。

  1. 日期A是我的芝加哥时间2019-05-22T04:02:14-05:00
  2. 日期B是我的服务器时间2019-05-20T01:39:34-04:00
  3. 我的时区设置为EST时,它们之间的时差51

当我将时区更改为 IST

  1. 日期A是我的芝加哥时间2019-05-22T04:03:34-05:00
  2. 日期B是我的服务器时间2019-05-20T01:39:34+05:30
  3. 我的时区设置为IST时,它们之间的时差为60

为什么两种情况下的日期都相同的小时数为何?

  getIntervalTime(dateA, dateB): ITimer {
    console.log("Date A is my Chicago time", dateA)
    console.log("Date B is my server time", dateB)
    console.log(moment.utc(dateA).diff(moment.utc(dateB), "hours"));

    intervalHours = moment.utc(dateA).diff(moment.utc(dateB), "hours")    
  }

1 个答案:

答案 0 :(得分:1)

在您的问题中,您给了两个非常不同的服务器时间。它们没有引用相同的实际时间点。在每种情况下,01:39:34是提供的时区偏移中的 local 时间。

2019-05-20T01:39:34-04:00 (EDT) = 2019-05-20T05:39:34Z (UTC) = 2019-05-20T11:09:34+05:30 (IST)
2019-05-20T01:39:34+05:30 (IST) = 2019-04-19T20:09:34Z (UTC) = 2019-04-19T16:09:34-04:00 (EDT)

正如您通过比较UTC时间所看到的,这两个时间戳之间有9.5小时的时差。这也反映在两个偏移量之间的差异(5.5--4 = 9.5)。

这是造成混乱的常见原因,通常人们将+-符号视为运算符,因此将其视为一条指令(“哦,我看到一个加号或减号,所以我必须加或减此值才能达到当地时间”)。但实际上,它不是运算符,而是偏移量的sign。正偏移值在UTC之前,而负偏移值在UTC之后。 (或者,人们可以将正偏移量视为GMT的东部,而将负偏移量视为GMT的西部。)

换句话说,ISO 8601格式的时间戳的日期和时间部分已转换为提供的上下文。

还要注意,服务器的时区并不重要,也不应该。现在是现在-time zones don't change that。因此,在大多数情况下,您应该只使用UTC时间。