操作日期时的时刻日期问题

本文关键字:日期 问题 时刻 操作 | 更新日期: 2023-09-27 18:14:35

当我检测到一个奇怪的行为时,所有的问题都开始了:我有一个长数字,意思是"自0001/01/01以来的毫秒数",然后在c#日期时间中,当我使用AddMilliseconds时,得到一个不同的日期值,从时刻1返回,在一个小时不同。如:

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:15小时和16:15时刻!!

这让我大吃一惊,所以我搜索错误,我找到了:

moment([1]).toDate()   =>  Mon Jan 01    1 00:00:00 GMT-0500 (Eastern Standard Time)

问题是,当我从自定义日期(moment([1]))创建时刻时,它使用GMT-0500 (Eastern Standard Time),但当应用时刻add方法时,它返回GMT-0400 (Eastern Daylight Time) !还要检查通过moment()或使用javascript日期new Date()创建时刻日期是否也使用GMT-0400 (Eastern Daylight Time)。这就是问题所在。

我的问题是,为什么会发生这种情况?这是个问题吗?

操作日期时的时刻日期问题

ECMAScript将夏令时规则视为始终适用的规则,即使在引入夏令时之前也是如此。

当您在设置为US EST时区的主机上为0001-01-01创建日期时,没有夏令时(因为US EDT从3月运行到11月初),因此将为0001-01-01T00:00:00-0500或0001-01-01T05:00:00Z计算UTC时间值(它们是同一时刻)。

在同一台主机上,当您添加足够的毫秒以达到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的Is Daylight Saving Time

从http://momentjs.com/docs/

#/查询/is-daylight-saving-time/:

moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST

事情是,当我做moment([1]).add(63613091700000).toDate()它以正确的方式计算,但结果日期时间是在DST所以它转换它。这次我不想要那样的行为