JavaScript、时区和夏令时

JavaScript, time zones, and daylight savings time

本文关键字:夏令时 时区 JavaScript      更新时间:2023-09-26

欢迎收看本周的又一个时区问题

我在SO上读了不少书,试图利用moment.js和date.js来帮助我,自从我开始尝试解决这个问题以来,我通常都会感到沮丧,所以如果有人能帮助我或指出SO上我一直找不到的重复问题,那就太棒了。


我有一页。此页面显示一系列时间,例如:7:28、7:38、7:48。我知道这些是上午还是下午。这些时间总是美国/纽约(当夏令时改变时,它们不会改变,因为无论夏令时如何,它们所对应的事件总是发生在该时间)。让我们称之为时间表。我想强调一下接下来的时间。

  • 这对于生活在美国/纽约的人们来说是微不足道的
  • 这对生活在美国/洛杉矶的人来说并不太可怕(假设我的逻辑有效)。
    • 我可以获取计算机在美国/洛杉矶的当前时间,将其转换为UTC,然后确定美国/洛杉矶目前是否正在观测夏令时,并确定美国/纽约应该是-0400还是-0500,将其应用于UTC,然后进行比较。这有点痛苦,因为你仍然总是在处理一个位于美国/洛杉矶的Date,而实际上并没有更改Date对象的时区,但我有一种可靠的方法可以从UTC时间向后(或向前)滚动小时

然而,当我试图确定在一个根本不观测夏令时的地区的计算机上是否观测到夏令时时,会发生什么

据我所知,JavaScript只会为当前时区创建Date对象,然后根据该Date对象来确定DST。

我应该不在乎吗?不管怎样,这个时代主要只与生活在美国/纽约的人有关。我只是想构建一个从另一个时区观看时有意义的应用程序,这样当国家/地区的凌晨3点,而美国/纽约的下午2点时,"时间表"会突出显示下午2点05分的事情即将发生,而不是凌晨3点05分。

所有与时间的比较都应该使用实例的getTime()进行。这将返回自UTC epoch以来的毫秒数。夏令时无关紧要。将getTime()值发送到服务器。然后,客户端脚本会将此值转换回JavaScript Date对象,如下所示:

mydate = new Date(longmillisFromAnotherTZ);

然后在mydate上使用任意方法来显示您想要的日期。这有道理吗?我不明白怎么会有问题。不过,我很乐意澄清任何事情。

编辑:

只是为了100%清楚。。。

如果两个不同的客户端需要在不同的时区相互显示它们的操作,我建议您只使用(new Date()).getTime()中的值,然后将其保存到服务器。然后,服务器将该值发送给每个相应的客户端。然后,客户端负责将其显示在自己适当的区域设置中。

此外,如果你想要一个适合获取时区和偏移量的库,getTimezoneOffset()是已知的片状库,你应该看看这个库:http://www.pageloom.com/automatic-timezone-detection-with-javascript

啊,我想我终于明白你在说什么了。您想根据用户计算机上的时间说"纽约市的当前时间是_",虽然(至少在文档中)支持setTimezone("EDT"),但似乎不支持setTimezone("America/New York")。您必须硬编码在EDT和EST之间切换的日期(基于当前时间GMT,您可以从用户的计算机上获得),或者使用第三方API(或在服务器端执行此操作)。