new Date()
当谈到夏令时线时,我已经阅读了许多关于 javascript 对象的 StackOverflow 问题——就像它们被交叉时一样。但是,我还没有看到关于这个特定问题的答案或在仍然依赖“unix time”的同时解决它的方法。
我个人选择通过将 javascript 日期作为日期传递给我的 PHP 代码而不是 unix 时间来解决这个问题。然而,挥之不去的问题仍然存在!我已经在 IE8、Chrome 和 FF 上确认了这种行为,所以我假设它对你的行为相同。(更新: OSX 用户可能无法生成此行为)
我的研究;与我的问题最接近的问题:
- 该用户在 DST 更改前后的特定时间工作。
- 该用户担心时间的显示取决于用户的时区。该页面上接受的答案提到这
getTimezoneOffset
是“片状”,这导致我没有深入研究。 - 请参阅下面我对其他有一些深刻见解的问题的回答
我在 2006 年 11 月 1 日左右生成了一个测试场景。根据您所在的时区,这可能会或可能不会对您起作用。如果我正确理解 javascript 方面,您需要将 PC 的时钟同步到
东部时间(美国和加拿大)并选中“自动调整夏令时时钟”。
我基于 PHP 中的“印第安纳波利斯”时区进行此实验。我的 javascript 结果,当我发现 2006 年 11 月 1 日的 unix 时间比 PHP 生成的时间少一小时(3600 秒)。根据这个页面(谢谢乔恩!)javascript是错误的。
两种语言结果于 2006 年 11 月 6 日重新达成一致!
这项研究和其他研究使我相信 Javascript 弄错了它的历史并选择了错误的星期天以从 DST 中“回退”——从而导致了我所看到的差异。
我试图尽可能简化这一点,但仍有不少齿轮在运转。
这是 PHP 代码和输出,显示了截至 2006 年 11 月 1 日的正确毫秒数。
date_default_timezone_set("美国/印第安纳州/印第安纳波利斯"); echo "2006 年 11 月 1 日的 Unix 时间是:".strtotime("11/01/2006")."\n"; echo "2006 年 11 月 6 日的 Unix 时间是:".strtotime("11/06/2006");
结果是:
Unixtime for November 1, 2006 is: 1162357200 (where the disagreement lies)
Unixtime for November 6, 2006 is: 1162789200
它们都基于 GMT-0500。
在 Javascript 中,(请参阅我的jsfiddle **),我调用它
new Date
,然后getTime()
像这样调用它(并删除毫秒):新日期("2006/11/01").getTime()/1000 新日期("2006/11/06").getTime()/1000
这会生成值
1162353600 <-- PHP outputs: 1162357200
1162789200 <-- the same as PHP for '2006/11/06'; congruence is restored
这与通过 PHP 输出的 3600 秒(或 1 小时)不同(对于 2006/11/01)。在我的 PHP 应用程序中处理此值(提前一小时)生成前一天(2006 年 10 月 31 日),这是不可接受的,因为它破坏了我的导航。(查看我的特定场景的更多解释)
用 Javascript 输出:Date("2006/11/01")
不调用getTime()
就解开了一些谜团,因为 javascript 揭示了它使用的偏移量GMT-0400
。
我的jsfiddle ** 实验(也在上面列出)显示了这些结果。
**(您可能需要更改计算机的时区才能看到相同的行为)。
可能发挥作用的是,根据维基百科,2006 年是印第安纳州开始使用 DST 的第一年。无论哪种方式都是一个奇怪的谜题。
由于我已经制定了我的解决方案(通过避免在我的 javascript 中依赖 unix 时间),我想我应该为后代发布这个,希望有人可能知道如何更正 javascript 显示的值。
问题是:如何将 PHP 和 javascript 之间的两个“unix 时间”结果对齐?我将不胜感激了解 DST '线' 周围的情况或一般情况。(我目前假设 DST 线是问题)。
更新:运行 Chrome 的 iMac 生成了 PHP 生成的结果。什么???荒野。对此行为的任何 javascript 端修复看起来都将是一项伟大的事业(或至少是丑陋的)。也许这不是javascript 问题,因为它会根据操作系统(或其他因素?)生成正确答案。
值得注意的是,在这台 iMac 上,我没有强制使用时区,我不确定这台 Apple 电脑是否允许。“自动设置日期和时间”的设置已选中 ( true
) 和disabled
。时区设置为东部夏令时间。未选中“自动设置时区”框 ( false
) 和disabled
。
我添加了Windows
标签以强调它在 OSX 中似乎不是问题。
更新:根据上面链接的网站,我验证了以下所有日期在适当的日期(更新的小提琴)交叉到了一个新的 GMT 偏移量——不像 2006 年的响应是一周的时间。即,在 2007 年 11 月 4 日,它是GMT-4
和 2007 年 11 月 5 日,它返回GMT-5
。
- 2007 年 3 月 11 日星期日凌晨 2 点 11 月 4 日星期日凌晨 2 点
- 2008 年 3 月 9 日星期日凌晨 2 点 11 月 2 日星期日凌晨 2 点
- 2009 年 3 月 8 日星期日凌晨 2:00 11 月 1 日星期日凌晨 2:00
- 2010 年 3 月 14 日星期日凌晨 2:00 11 月 7 日星期日凌晨 2:00
- 2011 年 3 月 13 日星期日凌晨 2 点 11 月 6 日星期日凌晨 2 点
最后,如果您知道在 2006 年将此错误提交给 Javascript 所依赖的任何时区源的正确渠道,请这样做并让我知道。