【问题标题】:Moment date issue when manipulating dates操作日期时的时刻日期问题
【发布时间】:2017-03-06 13:46:11
【问题描述】:

当我检测到一个奇怪的行为时,所有问题都开始了:我有一个长数字,表示“自 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)。这就是问题所在。

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

【问题讨论】:

  • 发生这种情况是因为这是在您运行 javascript 的系统上设置的时区。另外,回到耶稣出生的时候,似乎是一件很奇怪的事情,通常 javascript 从 1970 年开始计数,而不是 0001。
  • 以 UTC 存储和操作所有日期。在将日期时间放入 UI 之前,您对日期时间所做的最后一件事是使用用户的本地时区/DST 设置对其进行格式化,在从 UI 接收到日期时间后,您对日期时间所做的第一件事是将其转换为 UTC。跨度>
  • @adeneo 很确定耶稣直到 0001/12/25 才出生。时间充裕。
  • @EdPlunkett 说了什么。一直是UTC,否则跟踪时区/时间跨度会让你头疼。
  • .Net 默认使用 0001,我对此没有任何问题。我在这里说的不是要存储日期时间,而是关于奇怪的时刻行为,我认为它不应该使用两个不同的时间,我认为它应该是随之而来的,并且使用相同的用户时间。

标签: javascript c# date datetime momentjs


【解决方案1】:

我发现了正在发生的事情,但不知道如何处理它: 问题是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 中,因此它会对其进行转换。这次我不想要这种行为。

【讨论】:

  • 所有 ECMAScript 日期对象都是 UTC,它们没有时区偏移。主机系统偏移量用于在创建日期时计算 UTC 值,然后在使用非 UTC 方法时也用于生成“本地”字符串。如果要查看 UTC 时间,请使用 toISOString
【解决方案2】:

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

当您在设置为美国东部标准时间时区的主机中为 0001-01-01 创建日期时,没有夏令时(因为美国东部夏令时从 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多