javascript - 操作日期时出现日期问题

标签 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(东部标准时间),但是当应用 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/

相关文章:

Javascript 记录到本地计算机上的文件

javascript - ngOnInit() 中的 Angular 8 Http Observables

c# - 寻找半小时向上/向下的时间选择器控制

c# - 可以从编辑器模板中调用显示模板吗?

date - Parse.com — 在 Swift 中使用日期对象进行查询

javascript - 更改动态crm 2016中文本字段的颜色

Javascript 在 WebView 中不起作用 - Android?

c# - 如何知道点是否与 SolidWorks 生成的 CAD 文件中的 3D 对象相交?

date - 以年、月、日表示的两个日期之间的差异(在一列中)

ruby - Rails 应用程序的出生日期正则表达式 yyyy-mm-dd