代码之家  ›  专栏  ›  技术社区  ›  Ben

JSFiddle报告的时间与浏览器不同

  •  1
  • Ben  · 技术社区  · 10 年前

    当我跑步时 var d = new Date; alert(d.toLocaleString()) 在jsFiddle或w3Schools“Tryit Editor”中,它能够检测我将计算机设置到的位置,并报告该位置的正确时间(或至少是我在页面加载时选择的时间),同时考虑到其时区以及是否使用夏令时。这个 getTimezoneOffset() 方法还报告所选位置的正确偏移量。然而,当我在网页中使用这个javascript并离开浏览器来解释它时,我会通过浏览器获得不同的行为:

    • 在Chrome中,它总是提醒我现实生活中的位置,而不是我在操作系统中选择的位置。
    • 在Firefox中,除了我的真实位置之外,它没有考虑到任何位置的DST,而是在我的系统时间前一小时报告时间。
    • 在Safari中,它像jsfiddle一样工作。

    有人能解释这些差异,并建议我如何让我的网站像jsfiddle那样运行吗?

    编辑: http://jsfiddle.net/5p8tL/ ,与:

    <html>
    <body>
    <script>
         var d = new Date;
         alert(d.toLocaleString());
    </script>
    </body>
    </html>
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Community CDub    7 年前

    您看到的差异可能是由于每个浏览器从系统中读取时区设置的方式造成的。

    • Chrome仅在首次启动时读取时区。如果您更改了系统时区,则在重新启动之前,它不会接收到这些更改。

    • Windows上的Internet Explorer将在启动时读取时区,并侦听来自操作系统的消息,提醒它时区正在更改。我目前无法访问Mac,但我认为OSX上的Safari也有类似的功能。

    • Firefox在这方面有缺陷。它似乎每隔一段时间就会读取时区设置,因为如果您更改它们并在不重新启动的情况下进行检查,它不会立即看到。但最终它还是成功了。此外,时区的应用方式似乎也存在差异 toLocaleString toString 当它处于这种边缘状态时。如果你等待一段时间,那么最终它都会同步。Firefox报告时区错误还存在其他一些已知问题,正如我在 this blog post 。然而,这是我第一次听说它没有在时钟本身上正确应用DST,而且我无法在Windows上复制它,所以它可能是Firefox OSX特有的错误。这不会让我惊讶。

    无论如何,在更改时区后完全重新启动浏览器可能是个好主意。

    至于为什么你在jsFiddle中看不到和你在自己的网页上一样的行为,我不知道。原则上,这没有任何意义。他们应该有相同的行为。也许这些实例正在重新启动,而其他实例没有重新启动?只是猜测。

    此外,您可能应该使用 new Date() 而不是 new Date 。这是有效的,但JSLint会投诉。 See also this post .