【问题标题】:How to guess the timezone of a timestamp?如何猜测时间戳的时区?
【发布时间】:2017-04-15 09:57:52
【问题描述】:

上下文:

用户提供日期和时间以及特定的 UTC 偏移量

1994-06-05T08:15:30-05:00

然后通过一些 Java 日期时间库传递,这些库确定这发生在夏令时期间,并有助于在偏移量上增加一个小时(如果时间戳不在夏令时,则不加修改地返回):

1994-06-05T08:15:30-04:00(注意15:30 的时间不会改变)

最后,我在前端 (javascript) 中收到该字符串,我只需要完全按照输入的方式显示原始 UTC 偏移量,在本例中为 -05:00

在此之前我无法更改流程的任何部分,因此我唯一的选择是尝试对夏令时检测进行逆向工程,并在适当的时候减去一小时的偏移量。

由于日期和时间保持不变,一个明显的解决方案是检查IF date and time are in daylight savings time THEN subtract one hour from offset。对于大多数时间戳来说,这是可行的,但是在 DST 边界存在问题,因为例如相同的时间戳可能会在 DST 生效当天的凌晨 1 点到凌晨 2 点出现两次。考虑到有关如何生成最终时间戳的信息,我是否可以使用任何方法来消除在 DST 边界发生的部分或全部时间戳的歧义?

【问题讨论】:

  • 您使用的时间是 UTC - 在 UTC 时间中没有关于原始时区的有用信息,因为它可能绝对是任何东西 - 有时在处理日期/时间时使用字符串要容易得多(在我看来)
  • 日期和时间只是日期和时间。该数据没有任何内容可以将其识别为最初来自给定时区。您首先需要研究如何获取这些数据并从那里收集时区信息。
  • 这就是我提供有关如何生成时间戳的上下文的原因。如果时间戳不在夏令时,则返回时间戳,否则返回时间戳加上 1 小时偏移量。鉴于这些信息,我怀疑至少在某些情况下有办法猜测原始时区。
  • @K.R.S.很多地方都有夏令时。这不仅限于东海岸。为了识别原始时区,您需要一条或多条与该时区相关的信息。您拥有的唯一信息是日期、时间和 DST 偏移量。这些信息不足以唯一标识任何时区。
  • @K.R.S.回复:您的编辑。想象一下,来自 CST 的某个人在同一日期提交数据,但似乎比 EST 中的某个人早一小时。您在前端收到的数据将等于一小时后您从 EST 某人那里获得的数据。

标签: javascript datetime timezone momentjs


【解决方案1】:

一些事情:

  • EST 是时区缩写,不是时区。时区将由其 IANA/TZDB 标识符来标识,例如 America/New_York

  • 一般来说,应避免使用时区缩写,因为:

    • 它们可能不明确。例如,CST 可以是美国中部标准时间 (UTC-6)、古巴标准时间 (UTC-5) 或中国标准时间 (UTC+8)。

    • 在世界的某些地方,它们与一个区域相关联,而不是一个固定的偏移量。例如,MSK 在俄罗斯莫斯科已经使用了很长时间。它目前表示 UTC+3,但在过去的几年里,它表示 UTC+4。

    • 并非所有人都同意使用的缩写。例如,夏威夷有时称为HST(夏威夷标准时间),有时称为HAST(夏威夷-阿留申标准时间)

    • 并非世界上每个地方都使用英文缩写,甚至根本不是在其时区周围使用缩写。尤其是如果整个国家只适用一个时区。

  • 您在后端说您将EST 映射到-05:00。这意味着您在某处定义了一个表映射时区缩写为偏移量。您可能会发现该表非常固执己见,并且随着您的应用程序随着时间的推移而不断维护,它可能会不稳定。我建议不要这样做。

  • 您说您还确定由于 DST 您增加了一个小时。认识到 DST 在世界各地的做法都不同。如果您所拥有的只是与 UTC 的偏移量,则您无法可靠地确定 DST 是否有效。此外,地球上至少有一个地方(澳大利亚豪勋爵岛)在夏令时切换 30 分钟,而不是一小时。不要做任何假设。

  • 假设您指的是美国东部时区,那么在您提供1994-11-05 的那一天,东部时间是美国东部标准时间 (UTC-5)。所以你的例子是错误的,因为你不会在这个日期移动到 UTC-4。如果你这样做了,你的缩写无论如何都会变成EDT - 而不是EST

  • 您不能从偏移量返回时区或时区缩写,因为偏移量的使用方式不明确。

    • UTC-5 可以是EST,也可以是ACTCDTCOTCSTEASSTECTPET

    • UTC-4 可以是EDT,也可以是AMTASTBOTCDTCLTCOST、@98765435@5@、@987654356 、GYTPYTVET

  • 即使您知道您仅限于一个国家,并且您只有一个偏移量,但由于 DST 在某些地方的运作方式的性质,您也无法始终分辨出哪个时区。例如,美国的2016-11-06T01:00:00-05:00 可能是CDT (America/Chicago),或者可能是EST (America/New_York)。两者同时生效。

请查看以下内容:

【讨论】:

  • 顺便说一句 - 我也建议你观看:youtube.com/watch?v=-5wpm-gesOY
  • 是的。我正在阅读您的编辑。目前还不清楚你在问什么。最初您问如何回到时区。现在,您似乎在问,当您没有所有信息时,是否有办法消除歧义。在这两种情况下,答案是否定的。另外 - 你说它不是全球性的,但实际上准确地知道你的应用程序的地理范围是非常有帮助的。
  • 我会给你另一个你可能没有考虑过的问题。假设您获得了MST 作为输入。那是美国的UTC-7。但是现在您想知道 DST 是否生效,以便您可以切换到 UTC-6 - 除了亚利桑那州的大部分地区仍处于 MST 并且根本不使用 DST。 HAST (UTC-10) 也有同样的问题,因为阿拉斯加的阿留申群岛确实使用 DST,但夏威夷没有。
  • 归根结底,答案是 - 不。对不起。你不能。除非你想在很多极端情况下犯错。
  • 不,不能这样做。看来你需要更多的例子来说服你。考虑2016-06-01T00:00:00-07:00。太平洋时间是否针对夏令时进行了调整?或者是亚利桑那州没有夏令时的山区时间?没有办法说。
猜你喜欢
  • 2017-02-05
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2013-10-04
  • 2019-06-30
  • 2017-11-18
  • 1970-01-01
  • 2015-03-11
相关资源
最近更新 更多