当我检测到奇怪的行为时,所有问题都开始了:我有一个长数字表示“自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)
。这就是问题所在。
我的问题是,为什么会这样?这是一个问题吗?
答案 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中,因此它会对其进行转换。这次我不想要这种行为。