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

时间:2016-10-24 17:33:24

标签: javascript c# date datetime momentjs

当我检测到奇怪的行为时,所有问题都开始了:我有一个长数字表示“自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 (Eastern Standard Time),但在应用时刻add方法时,它会返回GMT-0400 (Eastern Daylight Time)!另请注意,moment()或使用javascript日期new Date()创建时刻日期也会使用GMT-0400 (Eastern Daylight Time)。这就是问题所在。

我的问题是,为什么会这样?这是一个问题吗?

2 个答案:

答案 0 :(得分:1)

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

当您在主机设置为美国东部时区时创建0001-01-01的日期时,没有夏令时(因为美国EDT从3月到11月初运行)所以为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

答案 1 :(得分:0)

我发现了正在发生的事情,但没有找到如何处理它: 问题是javascript的Is Daylight Saving Time

来自http://momentjs.com/docs/#/query/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中,因此它会对其进行转换。这次我不想要这种行为。