【问题标题】:javascript create date without daylight savings conversionjavascript创建没有夏令时转换的日期
【发布时间】:2016-12-08 07:47:06
【问题描述】:

当我使用日期构造函数 new Date('2015','12') 创建日期时,它会导致 2016 年 1 月 1 日星期五 00:00:00 GMT-0500(东部标准时间)。但不要假设我提供的日期已经应用了日光转换并为 2015 年 12 月创建日期对象,而不是 2016 年 1 月

【问题讨论】:

  • new Date('2015','12') 与 2015 年的第 13 个月约会,也就是 2016 年 1 月 - 与 DST 无关的问题...
  • 确实如此。感谢您指出了这一点。但我的问题很笼统。
  • 不清楚你想要什么。您期望的输出是什么?
  • 使用 Date 构造函数创建日期时,几乎总是使用主机系统的时区(根据 ECMA-262)。唯一的例外是提供了一个数字(解释为时间值,即自 ECMAScript 纪元以来的毫秒数)。
  • 看看这个:momentjs.com

标签: javascript angularjs date momentjs dst


【解决方案1】:

使用 Date 构造函数创建日期时,几乎总是使用主机系统的时区(根据 ECMA-262)。唯一的例外是提供数字(解释为时间值,即自 ECMAScript 纪元以来的毫秒数)或带有时区的 ISO 8601 格式字符串时。即使这样,日期的内部时间值(即自纪元以来的毫秒数)以 UTC 和主机系统时区偏移量计算,用于非 UTC 方法,如 getHoursgetMinutes 等

此外,当前系统设置的时区偏移量用于历史日期。因此,如果主机设置为夏令时,它将有时应用于实施夏令时之前的日期。此外,不会应用对夏令时转换日期和时间(甚至值)的历史更改。假定当前设置始终适用于过去和未来的日期。

因此,在创建 2016 年 2 月 3 日的日期时,以下所有内容都将应用主机系统的时区偏移:

new Date('2/3/2016'); // US format is assumed by most browsers.
                      // May also create an invalid Date
new Date(2016, 1, 3); // months are zero indexed so 1 is February
new Date('2016-02-03T00:00:00'); // note missing time zone

但是,以下将被视为 UTC(或无效):

new Date('2016-02-03');  // contrary to ISO 8601, missing time zone for this
                         // format only is assumed to be UTC
new Date('2016-02-03T00:00:00Z'); // Note has a time zone of GMT

如果您想从字符串中可靠地创建特定时刻的日期,则必须提供带有时区偏移量的字符串。然后自己解析它,因为日期字符串的解析在很大程度上取决于实现并且因实现而异。最好使用的格式是 ISO 8601 扩展格式,例如:

'2016-02-03T00:00:00-0800'

无论主机系统的设置如何,它都代表同一时刻。你只需要可靠地解析它。

有很多很好的解析和格式化库,或者您可以为特定的解析和输出格式编写自己的小函数。

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2017-08-28
    • 2019-10-04
    • 2013-12-09
    • 2017-03-08
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多