将Moment时区用于将来的事件,我应该保存什么?

Cla*_*ark 2 timezone recurring-events momentjs

我已经做了大量的研究,并且对随着时间的推移编程的想法是新的。

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

在创建活动时,我知道以后不应将活动存储在中UTC。我相信我需要:

  1. 当地日期时间
  2. UTC偏移
  3. Olson数据库ID Europe/London也许

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

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

所以我真正需要的是:

  1. 当地时间和日期(作为ISOString?)
  2. Olson时区ID。

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

Mat*_*int 5

您可以很容易地用moment-timezone可靠地转换本地时间:

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.
Run Code Online (Sandbox Code Playgroud)

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

您也可以使用任何常规的Moment函数轻松地计算出提前一小时的时间。

var earlierUTC = original.clone().utc().subtract(1, 'hour');
var earlierEastern = easternUS.clone().subtract(1, 'hour');
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 如果政客在事件发生前更改了时区或DST规则,该怎么办?今年在加利福尼亚不太可能发生这种情况,但确实会在短期内发生,并且在全球范围内有一定规律性。请参阅我的博客文章“时区更改的时间”。甚至在加利福尼亚州-说这是在夏季举行的年度活动,但随后又说像这样的一项法案已通过成为法律-您的抵消额是错误的。

您应该考虑一点。如果事件本地时间无效或含糊不清怎么办?

  • 无效的时间发生在弹簧向前的过渡上。例如,时钟从1:59移至3:00,但您有2:30的事件时间。对于单个事件,这种情况不太可能发生,但对于重复发生的事件,很容易发生。您必须决定如何处理此问题,但是如果您不确定,那么我建议将本地时间提前多少时间。因此,该事件将在当天的3:30,然后在下一次发生时返回2:30。

  • 后备过渡上会发生模棱两可的时期。例如,时钟从1:59移回1:00。如果您的活动在1:30运行,则必须决定是在第一个实例,第二个实例还是在两个实例上运行。在大多数情况下,我建议在第一时间运行(恰好是白天,而不是标准时间)。

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

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