Javascript:为什么日期不能返回正确的日期?

标签 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 进行了测试。

这怎么可能?

最佳答案

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

在巴西,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,为了避免这种困惑并与更发达国家保持一致。 -/-

关于Javascript:为什么日期不能返回正确的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948881/

相关文章:

javascript - 在 Node 的请求 hapijs 中获取客户端 ip 地址

javascript - HTTP 的 keep-alive 如何在 AJAX 应用程序中发挥作用

javascript:在函数完成处理之前执行函数的顺序 - 嵌套函数返回值?

java - 将日期从 GMT 时区转换为本地时区——使用 ISO_OFFSET_DATE_TIME

php - 如何在mySQL中触发总天数

javascript - 如何使用 'this' 在 jQuery 中选择具有类的特定元素

c# - 在 MVC ASP.net 中使用 X-editable 时不要重复自己的最佳方法

c - 在 C 中以 HTTP 响应日期格式生成日期字符串

javascript - 移动浏览器上的 HTML5 输入日期默认值行为

python - 将日期转换为 %Y :%j:%H:%M:%s in python with date command