将 Moment Timezone 用于未来事件,我应该保存什么?
Using Moment Timezone for Future Events, What should I save?
我做了相当多的研究,并且随着时间的推移对编程的想法有了新的认识。
我有一个应用程序,您必须能够在其中安排当地时间的会议。所以你可能会说“2017 年 12 月 23 日上午 9 点在旧金山”。事件位置是时间的视角。它也可能再次出现,这是一个不同但相关的问题。
当我创建一个事件时,我知道我不应该在 UTC
中存储未来的事件。我相信我需要:
- 本地日期时间
- UTC 偏移量
- Olson 数据库 ID
Europe/London
或者
但是,我打算在本地和服务器部分都使用 Moment Timezone。
通过使用这个库。这如何改变我的看法?这是否意味着我不再需要担心夏令时?如果你告诉我“2017/12/12 09:00”,我可以将它准确地转换为世界上任何时区的当地时间?
所以我真正需要的是:
- 本地时间和日期(作为 ISOString?)
- 奥尔森时区 ID。
稍后在服务器上,当我想在事件发生前 1 小时发送推送通知时。这 2 个属性(和 Moment Timezone)应该涵盖我吗?
您可以非常轻松地使用 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.
(使用 .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 规则怎么办?今年这在加利福尼亚不太可能发生,但它确实在短时间内发生,并且在全球范围内具有一定的规律性。请参阅我的博客 post On the Timing of Time Zone Changes. Even in California - say it was an annual event that took place in the summer, but then say a bill like this one 已通过成为法律 - 您的补偿是错误的。
有一点你应该考虑一下。如果事件本地时间无效或不明确怎么办?
无效时间发生在 spring-forward 转换上。例如,时钟从 1:59 移动到 3:00,但您有一个 2:30 事件时间。这对于单个事件不太可能发生,但对于重复发生的事件很容易发生。你必须决定你想如何处理这个,但如果你不确定那么我建议将当地时间提前一个差距的数量。所以事件将在那天的 3:30 发生,然后在下一次发生时返回到 2:30。
回退转换时会发生不明确的时间。例如,时钟从 1:59 回到 1:00。如果您的活动 运行 在 1:30 举行,您必须决定是 运行 在第一个实例、第二个实例还是两者都进行。在大多数情况下,我建议在 first 实例上使用 运行ning(恰好是夏令时,而不是标准时间)。
如果事件真的只有 运行s 一次,并且可能发生在回退过渡期间,那么可以通过以 UTC 或本地时间记录事件时间来消除歧义一个偏移量。请注意我之前提到的时区规则的变化。
Moment-timezone 在其转换过程中自动应用上述建议,因此除非您有理由偏离 - 您不必担心。
我做了相当多的研究,并且随着时间的推移对编程的想法有了新的认识。
我有一个应用程序,您必须能够在其中安排当地时间的会议。所以你可能会说“2017 年 12 月 23 日上午 9 点在旧金山”。事件位置是时间的视角。它也可能再次出现,这是一个不同但相关的问题。
当我创建一个事件时,我知道我不应该在 UTC
中存储未来的事件。我相信我需要:
- 本地日期时间
- UTC 偏移量
- Olson 数据库 ID
Europe/London
或者
但是,我打算在本地和服务器部分都使用 Moment Timezone。
通过使用这个库。这如何改变我的看法?这是否意味着我不再需要担心夏令时?如果你告诉我“2017/12/12 09:00”,我可以将它准确地转换为世界上任何时区的当地时间?
所以我真正需要的是:
- 本地时间和日期(作为 ISOString?)
- 奥尔森时区 ID。
稍后在服务器上,当我想在事件发生前 1 小时发送推送通知时。这 2 个属性(和 Moment Timezone)应该涵盖我吗?
您可以非常轻松地使用 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.
(使用 .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 规则怎么办?今年这在加利福尼亚不太可能发生,但它确实在短时间内发生,并且在全球范围内具有一定的规律性。请参阅我的博客 post On the Timing of Time Zone Changes. Even in California - say it was an annual event that took place in the summer, but then say a bill like this one 已通过成为法律 - 您的补偿是错误的。
有一点你应该考虑一下。如果事件本地时间无效或不明确怎么办?
无效时间发生在 spring-forward 转换上。例如,时钟从 1:59 移动到 3:00,但您有一个 2:30 事件时间。这对于单个事件不太可能发生,但对于重复发生的事件很容易发生。你必须决定你想如何处理这个,但如果你不确定那么我建议将当地时间提前一个差距的数量。所以事件将在那天的 3:30 发生,然后在下一次发生时返回到 2:30。
回退转换时会发生不明确的时间。例如,时钟从 1:59 回到 1:00。如果您的活动 运行 在 1:30 举行,您必须决定是 运行 在第一个实例、第二个实例还是两者都进行。在大多数情况下,我建议在 first 实例上使用 运行ning(恰好是夏令时,而不是标准时间)。
如果事件真的只有 运行s 一次,并且可能发生在回退过渡期间,那么可以通过以 UTC 或本地时间记录事件时间来消除歧义一个偏移量。请注意我之前提到的时区规则的变化。
Moment-timezone 在其转换过程中自动应用上述建议,因此除非您有理由偏离 - 您不必担心。