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

javascript create date without daylight savings conversion

当我使用日期构造函数 new Date('2015','12') 创建日期时,结果为 Fri Jan 01 2016 00:00:00 GMT-0500(东部标准时间)。但不要假设我提供的日期已经应用日光转换并为 2015 年 12 月创建日期对象,而不是 2016 年 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'

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

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