【问题标题】:Creating a Date object in a specific time zone在特定时区创建 Date 对象
【发布时间】:2017-09-21 20:36:16
【问题描述】:

我需要将 Javascript Date 对象传递给 Angular 模型,以便它可以在日期/时间选择器中向用户显示日期和时间。

数据以下列格式存储在数据库中:

date: Sat, 23 Sep 2017 21:00:00 CDT -05:00,

这个数据被传递到一个 Angular 指令中,我需要在其中创建一个代表它的 Date 对象。问题是,每当实例化 new Date() 时,它总是使用用户机器的时区。例如,如果用户机器在旧金山,上述日期对象将显示Sat Sep 23 2017 19:00:00 GMT-0700 (PDT)

我试图以多种方式操纵这个日期,包括:

  1. 使用 moment.js 进行时区操作,然后在结果时刻调用 .toDate()。这会丢弃所有时区信息,让我们回到第一方。
  2. 使用date.getTime()date.getTimezoneOffset() 的变化来计算所选时区自纪元以来的适当毫秒数。这也无法按预期工作。
  3. 完全剥离字符串的时区信息。这会导致 Date 对象错误地解释时间。

如何创建正确表示传入的字符串并尊重时区信息的 Javascript Date 对象?

【问题讨论】:

  • @JayLane 不幸的是没有。选择的答案建议在整个应用程序中转换为 UTC 时间,虽然这是一个很好的建议,但我们目前不能这样做。第二个建议实际上与我在第 2 项中提到的相同。
  • 你试过moment的时区库了吗?不确定它是否也在 moment.js 中耦合。momentjs.com/timezone
  • @JayLane 是的,我提到我在第 1 项中尝试了时刻。时区操作可以立即完成,但是一旦时刻通过时刻 .toDate() 函数转换为 JS Date 对象,它丢失其时区信息。
  • Date 对象没有时区,它们始终是 UTC。但是,您可以调整输出以表示任何特定时区的日期和时间。

标签: javascript angularjs date


【解决方案1】:

如何创建正确表示传入的字符串并尊重时区信息的 Javascript Date 对象?

“尊重时区信息”是什么意思?如果您的意思是“继续使用 -05:00 的偏移量”,那么这相当简单:解析字符串,存储偏移量并在从日期创建时间戳时使用它。

但是,如果您还想观察夏令时的变化,您将面临更大的挑战。假设“CDT”是“Central Daylight (Saving) Time”,那么使用它的一些地方在赤道以北(例如美国的地方),而一些地方在赤道以南,例如

Place              CDT starts     CDT ends
Tabasco, Mexico:    2 Apr 2017    29 Oct 2017
Chicago, USA:      12 Mar 2017     5 Nov 2017
Easter Is, Chile:  12 Aug 2017    12 May 2018 <-- Southern hemisphere

如您所见,一个地方使用 CDT 并不意味着您可以确定它何时从 CDT 更改为 CST。

以上是现在普遍使用 IANA 时区数据库位置标识符的原因(请参阅Wikipedia)。它允许用户根据位置而不是特定时区指定特定的偏移量和规则。

因此,除非您可以将“CDT -05:00”解析为“America/Chicago”或“Chile/EasterIsland”,否则您可以为所有时间戳保留“CDT -05:00”,使用 UTC,或者使用 UTC 并根据主机系统转换为“本地”。

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多