我有一个服务器日期时间(也是CST)和一个基于芝加哥时区的日期,当我发现两个日期之间的差异时,该值对于不同的时区是不同的。
我无法解决问题。
2019-05-22T04:02:14-05:00
2019-05-20T01:39:34-04:00
当我将时区更改为 IST
2019-05-22T04:03:34-05:00
2019-05-20T01:39:34+05:30
为什么两种情况下的日期都相同的小时数为何?
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")
}
答案 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时间。