javascript创建没有夏令时转换的日期

时间:2016-08-02 19:42:27

标签: javascript angularjs date momentjs dst

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

1 个答案:

答案 0 :(得分:2)

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

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

因此,在创建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'
无论主机系统的设置是什么,

代表同一时刻。你只需要可靠地解析它。

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