Php javascript错误地确定夏时制时间线——2006年的一个例子
我在javascriptPhp javascript错误地确定夏时制时间线——2006年的一个例子,php,javascript,windows,dst,unix-timestamp,Php,Javascript,Windows,Dst,Unix Timestamp,我在javascriptnew Date()对象上读到了很多关于夏时制时间线的StackOverflow问题,比如在跨越夏时制时间线时。然而,我还没有看到关于这个特定问题的答案,也没有找到解决这个问题的方法,同时仍然依赖于“unix时间” 我个人选择通过将javascript日期作为日期传递给我的PHP代码而不是unix时间来解决这个问题。然而,这个令人困扰的问题仍然存在!我已经在IE8、Chrome和FF上确认了这种行为,所以我假设它对您也会有同样的行为。(更新:OSX用户可能无法生成此行为)
new Date()
对象上读到了很多关于夏时制时间线的StackOverflow问题,比如在跨越夏时制时间线时。然而,我还没有看到关于这个特定问题的答案,也没有找到解决这个问题的方法,同时仍然依赖于“unix时间”
我个人选择通过将javascript日期作为日期传递给我的PHP代码而不是unix时间来解决这个问题。然而,这个令人困扰的问题仍然存在!我已经在IE8、Chrome和FF上确认了这种行为,所以我假设它对您也会有同样的行为。(更新:OSX用户可能无法生成此行为)
我的研究;与我的问题最接近的问题是:
- 在DST变更前后的特定时间工作
- 担心时间的显示取决于用户的时区。那一页上被接受的答案提到,
是“脆弱的”,这让我没有深入研究这个问题getTimezoneOffset
- 下面是我对其他问题的回答,这些问题有一些很好的见解
Unixtime for November 1, 2006 is: 1162357200 (where the disagreement lies)
Unixtime for November 6, 2006 is: 1162789200
它们都是基于GMT-0500
newdate
,然后像这样调用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
1162353600首先
但在这种情况下,我认为Javascript是错误的。您的Javascript在我的机器上的输出(设置了时区)在Chrome上是“Wed Nov 01 2006 00:00:00 GMT-0400(东部夏令时)”,在Internet Explorer上是“Wed Nov 1 00:00:00 EDT 2006”,但是
.NET的TimeZoneInfo
类给出了相同的结果:
// Ignore the daft ID; it really means Eastern time
var zone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var local = new DateTime(2006, 11, 1);
Console.WriteLine(zone.GetUtcOffset(local));
输出:
-5:00:00
(所以它知道现在不是夏时制。)
同样,在野田佳彦时间(我自己的日期和时间库,它使用tzdb数据库):
结果:
Local: 01/11/2006 00:00:00 Offset: -05 Zone: America/Indiana/Indianapolis
呸;我认为Jon有一些很好的观点,并证实了Javascript在Windows机器上拉错了数据库,因为夏令时开始于2006年11月的前几周,至少在印第安纳州是这样
我仍然不知道如何在Javascript中解决这个难题。然而,由于我的主要问题是Javascript和PHP之间的“不一致”(毕竟,如果它们在同一天/同一小时转换为DST,那么我永远不会发现有问题),因此解决方案可能是停止依赖其中一个
这虽然没有检索到unixtime,但演示了如果需要继续依赖unixtime,我可以如何解决这种紧张关系。这其实是一个非常巧妙的解决方案,伊姆霍。简要概述:通过AJAX检索时区信息。这意味着PHP在任何一天的00:00:00都会同意unixtime,因为它本质上是提供值本身
然而,这仍然不是问题的真正解决方案:Javascript检索到了对东部时区何时退出夏令时的错误理解。我仍然希望知道人们将如何着手纠正这个非常小和狭窄的不一致窗口
它会不会像我用Javascript测试OSX机器输出正确值后的“可能尚未开发”的Windows补丁一样复杂
我怀疑我的场景和我的关系,但这是我在研究过程中遇到的一个迷人的错误。在这个问题中,Date对象(取决于传递的格式)可能会生成一些非常令人惊讶的输出
如果有人想颠覆对用户计算机时区数据库计算正确日期的依赖性,可能会提供一些帮助,以编制和依赖自己的时区数据库。我没有研究过使用这种解决方案,也没有研究过如何覆盖Javascript返回的unixtime结果,但这是我找到的最接近的答案。我想知道开销是多少如果您可以实施这种类型的解决方案,请务必发布一个答案——这可能是我原始问题的真实答案。这很有趣,但您是否有实际问题,否则很可能会被关闭为离题。@vascowhite,问题是“如何使PHP和javascript的两个答案保持一致?或者在DST的“线”附近,或者一般来说,“对不起,我一定跳过了那一点。它在哪里?我不知道。”
Local: 01/11/2006 00:00:00 Offset: -05 Zone: America/Indiana/Indianapolis