当我检测到奇怪的行为时,所有问题就开始了:我有一个很长的数字,表示“自 0001/01/01 以来的毫秒数”,然后在 C# 日期时间中,当我使用 AddMilliseconds
获取一个与从第一时刻返回的日期值不同的日期值,相差一小时。例如。
new DateTime().AddMilliseconds(63613091700000); => {10/26/2016 3:15:00 PM}
moment([1]).add(63613091700000).toDate() => Wed Oct 26 2016 16:15:00 GMT-0400 (Eastern Daylight Time)
在 C# 中获取 15:15h 和此刻 16:15!!!
这让我大吃一惊,所以我搜索了错误,并找到了它:
moment([1]).toDate() => Mon Jan 01 1 00:00:00 GMT-0500 (Eastern Standard Time)
问题是,当我从自定义日期 (moment([1])
) 创建时刻时,它使用 GMT-0500(东部标准时间)
,但是当应用 moment add
方法时,它返回 GMT-0400(东部夏令时间)
!另请检查通过 moment()
创建时刻日期或使用 javascript 日期 new Date()
是否也使用 GMT-0400(东部夏令时)
.这就是问题所在。
我的问题是,为什么会发生这种情况?这是一个问题吗?
最佳答案
ECMAScript 将夏令时规则视为始终适用,甚至在引入夏令时之前也是如此。
当您在设置为美国东部时间时区的主机中创建 0001-01-01 的日期时,没有夏令时(因为美国东部时间从三月到十一月初),因此会为 0001-01 计算 UTC 时间值-01T00:00:00-0500 或 0001-01-01T05:00:00Z(它们是同一时刻)。
在同一台主机上,当您添加足够的毫秒数以到达 2016-10-26 15:15:00-0500 且当天实行夏令时的地方时,由于时间不同,时间将增加 1 小时夏令时偏移量,因此时间显示为 16:15:00 或完整时间:2016-10-26T16:15:00-0400。
但请注意,2016-10-26T15:15:00-0500 和 2016-10-26T16:15:00-0400 是完全相同的时刻(相当于 2016-10-26T20:15:00Z) ,唯一的区别是时区偏移。
如果您想显示 UTC 之外的特定时区的日期和时间,请使用 moment-timezone.js .
关于javascript - 操作日期时出现日期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40224228/