【发布时间】:2013-09-24 17:07:44
【问题描述】:
短版
在 JavaScript 中,new Date(2013, 9, 20) 可以合法地返回 10 月 19 日吗?
加长版
夏令时开始时,由于时钟向前调整,本地时间会出现差距。 如果我构造一个时间在此间隔内的 Date 对象,根据 ECMAScript 规范,预期的行为是什么?
各种浏览器的行为不同,如下所示。 (我在 Windows 8 上运行了这些测试。)
示例 1: 在太平洋时区 (UTC-08) 中,表达式
new Date(2013, 2, 10, 2, 34, 56).toString() // Sun Mar 10 2013 02:34:56
给出以下结果:
IE 10: Sun Mar 10 03:34:56 PDT 2013
IE 11: Sun Mar 10 2013 03:34:56 GMT-0700 (Pacific Daylight Time)
Chrome 29: Sun Mar 10 2013 01:34:56 GMT-0800 (Pacific Standard Time)
Firefox 23: Sun Mar 10 2013 03:34:56 GMT-0700 (Pacific Standard Time)
示例 2:在巴西利亚时区 (UTC-03) 中,表达式
new Date(2013, 9, 20, 0, 34, 56).toString() // Sun Oct 20 2013 00:34:56
给出以下结果:
IE 10: Sun Oct 20 01:34:56 UTC-0200 2013
IE 11: Sun Oct 20 2013 01:34:56 GMT-0200 (E. South America Daylight Time)
Chrome 29: Sat Oct 19 2013 23:34:56 GMT-0300 (E. South America Standard Time)
Firefox 23: Sat Oct 19 2013 23:34:56 GMT-0300
从这两个例子看来,IE是向前调时间,Chrome是向后调时间,Firefox拿不定主意。
规范所说的:根据我收集到的信息,new Date(yyyy, mm-1, dd, hh, mi, ss) 构造了一个时间值为 UTC(yyyy-mm-dd hh:mi:ss) 的 Date ),其中
UTC(t) = t – LocalTZA – DaylightSavingTA(t – LocalTZA)
LocalTZA 是标准时间的本地时区调整(例如,太平洋时区的 -08:00),而 DaylightSavingTA(t) 是 t 的夏令时调整(例如,DST 期间的 01:00,否则为 00:00)。
不过,我不清楚 DaylightSavingTA 应该为太平洋时区 t = 2013-03-10 10:34:56 或 t的参数返回什么> = 2013-10-20 03:34:56 在巴西利亚时区。
【问题讨论】:
-
好问题。最佳建议:不要这样做:)
-
@mplungjan:我问这个问题是因为我(可能还有其他人)已经编写了类似
new Date(year, month, day)的代码来构造一个没有时间的日期,显然这并不总是有效! -
我总是正常化。
new Date(year,month-1,date,0,0,0,0)但你可以决定使用new Date(year,month-1,date,12,0,0,0)来确保 -X 不会让你昨天约会 -
@mplungjan:添加这些零没有帮助。将小时设置为 12 确实可以,但有多少开发人员会考虑这样做?
标签: javascript date time dst