【问题标题】:Using Moment Timezone for Future Events, What should I save?为未来事件使用时刻时区,我应该保存什么?
【发布时间】:2017-08-29 22:56:02
【问题描述】:

我已经进行了大量的研究,并且对随时间进行编程的想法是新的。

我有一个应用程序,您必须能够在本地时间安排会议。所以你可能会说“2017 年 12 月 23 日上午 9 点,旧金山”。事件位置是时间的角度。它也可能再次出现,这是一个不同但相关的问题。

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

  1. 本地日期时间
  2. UTC 偏移量
  3. Olson 数据库 ID Europe/London 可能

但是,我计划在本地和服务器部分使用Moment Timezone

通过使用这个库。这如何改变我的看法?这是否意味着我不再需要担心夏令时?如果您告诉我“2017/12/12 09:00”,我可以将其准确地转换为世界上任何时区的当地时间?

所以我真正需要的是:

  1. 本地时间和日期(作为 ISOString?)
  2. 奥尔森时区 ID。

稍后在服务器上,当我想在事件前 1 小时发送推送通知时。这 2 个属性(和 Moment Timezone)应该涵盖我吗?

【问题讨论】:

    标签: timezone momentjs recurring-events


    【解决方案1】:

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

    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 已通过成为法律 - 你的抵消是错误的。

    有一点你应该考虑。如果事件当地时间无效或不明确怎么办?

    • 无效时间发生在 spring-forward 转换中。例如,时钟从 1:59 移动到 3:00,但您有 2:30 的事件时间。这对于单个事件不太可能发生,但对于重复发生的事件很容易发生。您必须决定如何处理此问题,但如果您不确定,那么我建议您将当地时间提前一段时间。所以事件会在当天的 3:30,然后在下一次发生时回到 2:30。

    • 在回退转换中会出现模棱两可的时间。例如,时钟从 1:59 移回 1:00。如果您的活动在 1:30 运行,则您必须决定是在第一个实例上运行,还是在第二个实例上运行,或两者都运行。在大多数情况下,我建议在 first 实例上运行(恰好是白天时间,而不是标准时间)。

      如果事件真的只运行一次,并且可能是在回退过渡期间,那么可以通过以 UTC 或本地时间记录事件时间并带有偏移量来消除歧义。请注意我前面提到的时区规则的变化。

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

    【讨论】:

    • 谢谢你,马特,也在这里,感谢你在过去几天阅读的关于这个主题的所有其他答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2015-06-15
    • 2016-06-27
    • 2015-05-11
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多