Cla*_*ark 2 timezone recurring-events momentjs
我已经做了大量的研究,并且对随着时间的推移编程的想法是新的。
我有一个应用程序,您必须能够在当地时间安排会议。因此,您可能会说“ 2017年12月23日上午9点在旧金山”。事件位置是时间的角度。它也可能再次发生,这是一个不同的问题,但相关。
在创建活动时,我知道以后不应将活动存储在中UTC
。我相信我需要:
Europe/London
也许但是,我计划在本地和服务器部分都使用Moment Timezone。
通过使用此库。那如何改变我的看法?这是否意味着我不再需要担心夏时制?如果您告诉我“ 2017/12/12 09:00”,我可以将其准确地转换为世界上任何时区的本地时间吗?
所以我真正需要的是:
稍后在服务器上,当我想在事件发生前1小时发出推送通知时。我应该涵盖这两个属性(和Moment时区)吗?
您可以很容易地用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:00
和America/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在转换过程中会自动应用上述建议,因此,除非您有偏离的理由-您不必担心。