使用Moment Timezone进行未来事件,我应该保存什么?

时间:2017-04-04 16:06:10

标签: timezone momentjs recurring-events

我做了大量的研究,并且对时间编程的想法不熟悉。

我有一个应用程序,您必须能够在当地时间安排会议。所以你可能会说“2017年12月23日上午9点在旧金山”。活动地点是时间的视角。它也可能复发,这是一个不同的问题,但相关。

当我创建活动时,我知道我不应该将未来的活动存储在UTC中。我相信我需要:

  1. 本地日期时间
  2. UTC偏移
  3. Olson数据库ID Europe/London或许
  4. 但是,我计划在本地和服务器部分使用Moment Timezone

    使用此库。这如何改变我的前景?这是否意味着我不再需要关注夏令时?如果你告诉我“2017/12/12 09:00”,我可以准确地将它转换成世界上任何时区的当地时间吗?

    所以我真正需要的是:

    1. 本地时间和日期(作为ISOString?)
    2. Olson TimeZone ID。
    3. 稍后在服务器上,当我想在事件发生前1小时发送推送通知。这两个属性(和时刻时区)应该包括在内吗?

1 个答案:

答案 0 :(得分:5)

您可以非常轻松地使用时刻区域可靠地转换本地时间:

var original = moment.tz('2017-12-23T09:00:00', 'America/Los_Angeles');

var easternUS = original.clone().tz('America/New_York');
var centralEU = original.clone().tz('Europe/Berlin');
var westAUS = original.clone().tz('Australia/Perth');
var japan = original.clone().tz('Asia/Tokyo');
// etc.

(使用.format(...)生成具有所需输出的字符串。)

您还可以使用任何正常的Moment函数轻松计算一小时前的时间。

var earlierUTC = original.clone().utc().subtract(1, 'hour');
var earlierEastern = easternUS.clone().subtract(1, 'hour');

是的,正如您所看到的,您需要存储的只是2017-12-23T09:00:00America/Los_Angeles

有人可能会考虑使用偏移量存储事件时间,例如2017-12-23T09:00:00-08:00,但是你遇到了一些问题:

  • 如果事件每月重复一次怎么办?当DST在3月开始时,您必须决定是否将当地时间保持在上午9点并将偏移更改为-7,或者原始意图是否等效于UTC时间(17:00Z),这将移动当地时间到上午10点。

  • 如果政治家在事件发生前更改时区或DST规则怎么办?今年加利福尼亚州不太可能这样做,但它确实会在短时间内发生,并在全球范围内有一定的规律性。请参阅我的博文On the Timing of Time Zone Changes。即使在加利福尼亚州 - 也就是说它是在夏季举行的年度活动,但随后说法案like this one已被纳入法律 - 你的抵消将是错误的。

你应该考虑一点。如果事件当地时间无效或含糊不清,您会怎么做?

  • 弹跳转换发生无效时间。例如,时钟从1:59移动到3:00,但您有2:30的活动时间。对于单个事件来说,这不太可能发生,但是反复出现这个事件很容易发生。你必须决定如何处理这个问题,但是如果你不确定那么我建议用差距来推进当地时间。所以活动将在当天的3:30进行,然后在下次发生时再回到2:30。

  • 在回落过渡时出现不明确的时间。例如,时钟从1:59回到1:00。如果您的事件在1:30运行,则必须决定是在第一个实例,第二个实例还是两者上运行。在大多数情况下,我建议运行第一个实例(恰好是白天时间,而不是标准时间)。

    如果事件真的只运行一次,并且可能是在后退转换期间,则可以通过以UTC或本地时间记录事件时间来消除歧义。请注意我之前提到的时区规则的变化。

Moment-timezone会在转换过程中自动应用上述建议,因此除非您有理由偏离 - 否则您不必担心。