我做了大量的研究,并且对时间编程的想法不熟悉。
我有一个应用程序,您必须能够在当地时间安排会议。所以你可能会说“2017年12月23日上午9点在旧金山”。活动地点是时间的视角。它也可能复发,这是一个不同的问题,但相关。
当我创建活动时,我知道我不应该将未来的活动存储在UTC
中。我相信我需要:
Europe/London
或许但是,我计划在本地和服务器部分使用Moment Timezone。
使用此库。这如何改变我的前景?这是否意味着我不再需要关注夏令时?如果你告诉我“2017/12/12 09:00”,我可以准确地将它转换成世界上任何时区的当地时间吗?
所以我真正需要的是:
稍后在服务器上,当我想在事件发生前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:00
和America/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会在转换过程中自动应用上述建议,因此除非您有理由偏离 - 否则您不必担心。