我来自巴西,我用 Javascript 编写了这段代码
var dt = new Date(2012,9,21); // Oct-21-2012
alert(dt.getDate());
但是,它产生 20 而不是 21。我用 Firefox 18、Chrome 24 和 Internet Explorer 8 进行了测试。
怎么可能?
我来自巴西,我用 Javascript 编写了这段代码
var dt = new Date(2012,9,21); // Oct-21-2012
alert(dt.getDate());
但是,它产生 20 而不是 21。我用 Firefox 18、Chrome 24 和 Internet Explorer 8 进行了测试。
怎么可能?
你遇到了一个巨大的巧合。
在巴西,2012 年 10 月 21 日是该国大部分地区夏令时的开始,因此巴西不存在 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,只需在 Date() 调用中放置一个大于或等于 1 的虚拟小时值,如上所示。
评论后编辑:因此巴西(以及伊朗、黎巴嫩、巴拉圭、智利和葡萄牙等国家)应将夏令时的开始时间更改为 2:00 而不是 0:00,以避免这种混淆并与更多发达国家。 -/-