JavaScript、时区和夏令时

JavaScript、时区和夏令时,javascript,timezone,dst,Javascript,Timezone,Dst,欢迎收看本周的《另一个时区问题》: 我已经读了很多关于SO的书,试图利用moment.js和date.js来帮助我,自从我开始尝试解决这个问题以来,我一直被挫败感困扰,所以如果有人能帮助我或指出重复的问题,让我无法找到,那就太棒了 我有一页。此页面显示一系列时间,例如:7:28、7:38、7:48。我知道这些是上午还是下午。这些时间总是在美国/纽约(当夏令时改变时,它们不会改变,因为它们对应的事件总是在那个时间发生,而不管DST如何)。让我们称之为时间表。我想强调下一个时间 这对于生活在美国

欢迎收看本周的《另一个时区问题》:

我已经读了很多关于SO的书,试图利用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分的事情。

所有与时间的比较都应该使用
getTime()
您的实例。返回自UTC历元以来的毫秒数。DST不重要。将
getTime()
值发送到服务器。然后,客户端脚本将此值转换回JavaScript
Date
对象,如下所示:

mydate = new Date(longmillisFromAnotherTZ);
然后使用
mydate
上的任何方法显示您想要的日期。这有意义吗?我看不出这是怎么回事。不过,我很乐意澄清一切

编辑:

我只是想说100%清楚

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


另外,如果您想要一个能够很好地获取时区和偏移量的库,
getTimezoneOffset()
被认为是脆弱的,那么您应该查看这个库:

啊,我想我终于明白您的意思了。根据用户计算机上的时间,您可以这样说,“纽约市的当前时间是”,虽然对
设置时区(“EDT”)
有支持(至少在文档中是这样),但对
设置时区(“美国/纽约”)
似乎没有支持。您必须硬编码在EDT和EST之间切换的日期(基于当前时间GMT,您可以从用户的计算机获取),或者使用第三方API(或者在服务器端执行此操作)。

您能在JSFIDLE上创建一个显示问题行为的最小失败示例吗?如果昆特考试不及格,那就太可怕了为了看到这种现象,您需要首先在带有DST的时区中观察页面。您将看到这两个偏移返回不同的值。然后将时区设置为不遵守DST的时区,退出浏览器,然后重新启动。请看以下两幅图:并且-我不知道还有其他方法可以确定DST是否发生,除了我正在展示的(Date.js就是这样做的)现在我正在构建示例,我想我可以简单地硬编码一些日期来帮助我确定是否是夏令时,但是,如果我想转换的地区停止观测DST,这将在没有代码维护的情况下失败。而且,一个时区中的一天可能是另一个时区中的另一天(例如,纽约时区转换的前一天是北京同一时间时区转换的前一天)。不仅如此,似乎即使是同时遵守夏令时的国家也可能在不同的日子遵守夏令时(欧盟和美国在三月份是不同的日子),因此,即使在DST观测时区内进行计算,结果有时仍然是错误的。我不明白这是什么问题。看起来您已经展示了date.js非常擅长确定本地时间的时区偏移量。如果您想在另一个时区显示时间,请考虑使用SETimeTZONEOffice?因为没有直接的服务器/ JavaScript通信,但我知道您将如何处理这个问题。我确实可以让服务器输出其自UTC纪元以来的ms以及标准化为EST的时间,我可以完全忽略这些EST时间,并与服务器在页面上隐藏的时间进行比较。这就是你通常的意思吗?我不想曲解,因为我已经很难在文本中表达我的问题:)好的,我明白你的意思。本案中的情况令人担忧