在特定时区创建Date对象

时间:2017-09-21 20:36:17

标签: javascript angularjs date

我需要将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对象错误地解释时间。
  4. 如何创建一个Javascript Date对象,该对象正确表示传入的字符串并尊重时区信息?

1 个答案:

答案 0 :(得分:0)

  

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

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

但是,如果您还想观察夏令时的变化,那么您将面临更大的挑战。假设“CDT”是“中央日光(节约)时间”,那么使用它的一些地方位于赤道以北(例如美国的地方),有些地方位于赤道以南,例如。

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并根据主机系统转换为“本地”。