Javascript:为什么日期没有返回正确的日子?

时间:2013-02-19 02:37:07

标签: javascript date

我来自巴西,我在Javascript中编写了这段代码

var dt = new Date(2012,9,21);   // Oct-21-2012
alert(dt.getDate());

然而,它产生20而不是21.我已经使用Firefox 18,Chrome 24和Internet Explorer 8测试过。

怎么可能?

1 个答案:

答案 0 :(得分:2)

你遇到了一个巨大的巧合。

在巴西,10月21日至2012年是该国大部分地区夏令时的开始,因此巴西不存在2012年10月21日0:0和1:0之间的当地日期!

其他国家的某些人在同一天没有遇到同样的问题。

请参阅:http://www.timeanddate.com/news/time/brazil-dst-2012.html

在巴西,问题中的代码确实输出了20

var dt = new Date(2012,9,21);  // 21-Oct-2012 0:0
alert(dt.getDate());

但是,稍微改变会产生21,因为1小时足以“跳过”丢失的小时:

var dt = new Date(2012,9,21,1);  // 21-Oct-2012 1:00
alert(dt.getDate());

请参阅:http://www.timeanddate.com/time/dst/2013.html

评论后修改:例如,在美国,2013年3月10日将启动夏令时。

var dt = new Date(2013,02,10);  // March-10-2013
alert(dt.getDate());    // Output: 10

为什么是对的?因为在美国,夏令时在巴西以2:00而不是0:00跳跃,因此隐含的0小时保护生成的日期免受问题的影响。但是,在计算时间内仍然可能出现错误。 的 - / -

在巴西,情况应该在许多处理日期的网站中引发一个错误,无论时间如何。可以在表单中输入日期,算法以错误的方式计算经过的天数。

例如,如果有人使用这个漂亮的javascript代码在表单中输入日期( DHML Goodies Calendar),并且在决定将该日期保存在数据库中之后,如果一个人运气不好以满足特殊日期,则可能会得到错误的日期。

最终解决方案是使用UTC(协调世界时)时间,因为没有夏令时更改并且您使用了一种抽象时间。在大多数实际应用中没有问题。

var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12));
alert( (dt.getUTCMonth()+1) + '/' + dt.getUTCDate() + '/' + 
        dt.getUTCFullYear() + " " + dt.getUTCHours()+ ':' + 
        dt.getUTCMinutes() + ':' + dt.getUTCSeconds() );

如果有人不使用小时,分钟和秒,而不是使用UTC,只需将虚拟小时值设置为大于或等于1,如上所示,在Date()调用中。

评论后编辑:因此,巴西(以及伊朗,黎巴嫩,巴拉圭,智利和葡萄牙等国家/地区)应将夏令时的开始时间更改为2:00而不是0:00,为了避免这种混乱并与更发达的国家保持一致。 的 - / -