Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php javascript错误地确定夏时制时间线——2006年的一个例子_Php_Javascript_Windows_Dst_Unix Timestamp - Fatal编程技术网

Php javascript错误地确定夏时制时间线——2006年的一个例子

Php 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用户可能无法生成此行为)

我在javascript
new Date()
对象上读到了很多关于夏时制时间线的StackOverflow问题,比如在跨越夏时制时间线时。然而,我还没有看到关于这个特定问题的答案,也没有找到解决这个问题的方法,同时仍然依赖于“unix时间”

我个人选择通过将javascript日期作为日期传递给我的PHP代码而不是unix时间来解决这个问题。然而,这个令人困扰的问题仍然存在!我已经在IE8、Chrome和FF上确认了这种行为,所以我假设它对您也会有同样的行为。(更新:OSX用户可能无法生成此行为)

我的研究;与我的问题最接近的问题是:

  • 在DST变更前后的特定时间工作
  • 担心时间的显示取决于用户的时区。那一页上被接受的答案提到,
    getTimezoneOffset
    是“脆弱的”,这让我没有深入研究这个问题
  • 下面是我对其他问题的回答,这些问题有一些很好的见解
我在2006年11月1日左右生成了一个测试场景。根据您所在的时区,这可能对您起作用,也可能对您不起作用。如果我正确理解javascript方面,您需要将PC的时钟同步到

东部时间(美国和加拿大),并检查“自动调整夏令时时钟”

我以PHP中的“印第安纳波利斯”时区为基础进行了这个实验。我的javascript结果是,当我发现2006年11月1日的unix时间比PHP生成的时间少了一个小时(3600秒)。根据(谢谢Jon!)的说法,javascript是错误的

两种语言的结果于2006年6月11日重新达成一致

这项研究和其他研究使我相信Javascript的历史是错误的,选择了错误的星期天从DST中“后退”——从而导致了我所看到的差异

我已经尽可能地简化了这一点,但仍有相当多的齿轮在运转

  • 显示截至2006年1月11日的正确毫秒数

    日期默认时区设置(“美国/印第安纳/印第安纳波利斯”); echo“2006年11月1日的Unixtime为:”.strotime(“11/01/2006”)。“\n”; echo“2006年11月6日的Unixtime为:”.strotime(“11/06/2006”)

  • 结果是:

    Unixtime for November 1, 2006 is: 1162357200 (where the disagreement lies)
    Unixtime for November 6, 2006 is: 1162789200
    
    它们都是基于GMT-0500

  • 在Javascript中(参见我的**),我调用
    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