JavaScript, time zones, and daylight savings time
欢迎来到本周的另一个时区问题:
我读了不少书,试图操纵moment.js和date.js来帮助我,从我开始尝试解决这个问题以来,我一直感到很沮丧,所以如果有人能帮我解决这个重复的问题,让我无法找到,那就太棒了。
我有一页。此页显示一系列时间,例如:7:28、7:38、7:48。我知道这些是不是上午/下午。这些时间总是美国/纽约(夏令时变化时不会改变,因为它们对应的事件总是发生在该时间,而不管DST如何)。让我们称之为时间表。我想强调下一个时间。
- 这对居住在美国/纽约的人来说是微不足道的。
- 这对居住在美国/洛杉矶的人来说并不太可怕(假设我的逻辑可行)。
- 我可以利用美国/洛杉矶计算机的当前时间,将其转换为UTC,然后确定美国/洛杉矶当前是否遵守DST,并确定美国/纽约应为-0400还是-0500,将其应用于UTC,并进行比较。这有点伤人,因为你总是在处理一个基于美国/洛杉矶的日期,而实际上并没有改变日期对象的时区,但是我有一个可靠的方法从UTC时间向后(或向前)滚动小时。
然而,当我试图确定在一个根本不遵守夏令时的地区,计算机是否在观察夏令时,会发生什么?
据我所知,javascript将只为当前时区创建日期对象,然后根据该日期对象来确定DST。
我应该不在乎吗?不管怎样,《纽约时报》主要与居住在美国/纽约的人们有关。我只是在尝试构建一个应用程序,当从另一个时区查看时,它是有意义的,当它在没有夏令时的国家凌晨3点,在美国/纽约的下午2点,"时间表"强调的是,下午2:05的事情即将发生,而不是凌晨3:05的事情。
- 您能在JSfiddle上创建一个显示问题行为的最小失败示例吗?如果在那里进行的库尼特测试不及格,那就太棒了。
- 我来试试。
- jsfiddle.net/bbdl5-为了看到这种现象,您需要在使用dst的时区中首先观察页面。你会看到这两种补偿方式会有所不同。然后将时区设置为不观察DST的时区,退出浏览器并重新启动它。请参阅以下两张图片:i.imgur.com/pxqij.jpg和i.imgur.com/zaxi6.jpg-我不知道另一种方法来确定是否发生DST,而不是我正在显示的内容(这是date.js如何做到的)
- 既然我正在构建示例,我想我可以简单地硬编码一些日期,以帮助我确定是否是夏令时,但如果我要转换的区域停止观察DST,那么没有代码维护,这将失败。
- 同一时区的某一天在不同时区可能是不同的一天(例如:纽约时区转换前一天是北京时区转换的当天)。不仅如此,而且似乎即使是同时遵守夏令时的国家也可能在不同的日子遵守夏令时(欧盟和美国在三月份是不同的日子),因此即使在DST观察时区内计算,结果有时仍然是错误的。
- 我看不出这里有什么问题。看起来您已经证明了date.js非常擅长确定本地时间的时区偏移量。如果要在其他时区显示时间,请考虑使用setTimeZoneOffset?
- 但我不知道是将其设置为-0500还是-0400,因为我不知道美国/纽约目前是否在观察DST。
- en.wikipedia.org/wiki/tz_数据库
所有与时间的比较都应该使用您实例的getTime()。这将返回自UTC时代以来的毫秒数。DST无关紧要。您向服务器发送getTime()值。然后,客户端脚本将此值转换回javascript Date对象,如下所示:
1
| mydate = new Date(longmillisFromAnotherTZ); |
然后在mydate上使用任何方法来显示您想要的日期。这有道理吗?我看不出有什么问题。不过,我很乐意把事情弄清楚。
编辑:
只是要100%清楚…
如果两个不同的客户机需要在不同的时区相互显示其操作,我建议您只使用(new Date()).getTime()中的值,然后将其保存到服务器。然后服务器将这个值发送到每个相应的客户机。然后,客户机负责将其显示在自己适当的区域设置中。
另外,如果您想要一个适合获取时区和偏移量的库,getTimezoneOffset()是已知的薄片状的,您应该查看这个库:http://www.pageloom.com/automatic-timezone-detection-with-javascript
- 好吧,没有直接的服务器/javascript通信,但我知道您要用它来做什么。我确实可以让服务器输出自UTC epoch以来的ms以及标准化到est时间,我可以完全忽略这些est时间,并与服务器在页面上隐藏的时间进行比较。你一般都是这么想的吗?我不想曲解,因为我已经很难用文字来表达我的问题了:)
- 我已经更新了,希望能提供更多的信息。
- 好吧,我明白你的意思。在这种情况下,服务器将EST中的页面上的文本显示给可能位于任何位置的客户机。虽然我需要在页面上显示EST中的时间,但我肯定可以从这些时间的epoch(使用服务器)中获得UTC,并将它们放入数据属性中,我可以与javascript进行比较。这应该是有效的,并且与您建议始终使用gettime()和完全忽略时区之间的转换相对应。
- 有趣的是,当我不得不浏览一个受欢迎的体育网站时,我也遇到了同样的问题;P我完全按照你现在的方式做了。
啊,我想我终于明白你在说什么了。你想说的是,"纽约市目前的时间是基于用户电脑上的时间",虽然支持(至少在文档中)setTimezone("EDT"),但似乎没有支持setTimezone("America/New York")。您将不得不硬编码在EDT和EST之间切换的日期(基于从用户计算机上获得的当前格林威治标准时间),或者使用第三方API(或在服务器端执行此操作)。
- 这绝对是解释这个问题的一种极好而简明的方式。在我决定什么是最好的答案之前,我会给这个问题更多的时间,但是现有的两个答案都应该得到一个赞成票,所以现在这些是……