时间很辛苦 - 在 UTC 和另一个时区工作

Time is hard - working in UTC and another timezone

我有一个应用程序每小时接收一个事件(通过石英)。 所以这可能每天发生 24 次。

那天有3次排除时间我不想在收到事件时采取任何行动(必须仍然通过石英接收事件,所以解决方案是不更新石英cron表达式)

我需要在客户的时区为这3个时间配置时间。 在这种情况下,将是 CEST,其中观察到夏季 (UTC+2) 和冬季 (UTC+1) 时间。 时间是 00:00、08:00、16:00,我将在这些时间的两边有 5 分钟的缓冲时间。

所以以 08:00 为例,我在 07:55 到 08:05 之间的任何时间收到一个事件,我将不执行任何操作。

我的应用程序将在 UTC 时间运行,但排除时间需要在 CEST 和未来其他时区中配置。

最初的想法是采用当前日期并计算出该日期的 UTC 排除时间,但我认为这种方法会有问题

有什么想法吗?

小心,假设您谈论的是 "local day",在包含 daylight saving time transitions 的日子里,该事件可能每天收到 23 或 25 次。并非每个本地日都有 24 小时。

还意识到有几个时区在午夜时分进行 DST 转换。例如,在巴西,时钟将从 2015-10-17 23:59:59 移动到 2015-10-18 01:00:00,完全跳过午夜。这一天不存在午夜,因此您必须决定是在 1:00 接收事件,还是根本不接收。

然后在 2016-02-20 23:59:59,时钟将回到 2016-02-20 23:00:00。虽然午夜只存在一次,但延伸到 23:55 的 "window" 将重复 两次 。您必须决定是否希望事件能够在任一槽、第一个槽或第二个槽中接收。

预先计算出事件的UTC时间的想法是有可取之处,但关键是重现规则保持本地时间和时区,而且您不会丢弃该信息。您很可能需要重新计算 特定事件的 UTC 时间。当政府决定更改其时区的 DST 规则或基准偏移量时,可能会发生这种情况。通常,任何时候应用时区更新时,都应该考虑所有未来的 UTC 时间并重新计算它们。

您可以订阅 tz announcements 邮件列表,然后监控您自己的平台以获取相应的更新,从而收到时区更改通知。

另请参阅:Daylight saving time and time zone best practices

还有我对 How to store repeating dates keeping in mind Daylight Savings Time 的回答。