我来自巴西,我在Javascript中编写了这段代码
var dt = new Date(2012,9,21); // Oct-21-2012
alert(dt.getDate());
然而,它产生20而不是21.我已经使用Firefox 18,Chrome 24和Internet Explorer 8测试过。
怎么可能?
答案 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,为了避免这种混乱并与更发达的国家保持一致。 的 - / - 强>