秋季时间变更期间的预定作业

秋季时间变更期间的预定作业

我想知道其他人如何处理这种情况。

假设您有一项任务计划在凌晨 1:30 运行。在秋季,当时间发生变化时,1:00:00 到 1:59:59 之间的时间会重复,因此该任务将运行两次。

可能是 Windows 任务计划程序、SQL 代理或任何其他计划工具。这些工具中的大多数似乎都是基于机器时间,而不是 UTC 时间。如果我告诉它每晚在 UTC 时间运行作业,那么就不会出现重复小时问题。

答案1

根据当地时间正确安排未来任务,同时考虑到时区和夏令时,是一个非常复杂的课题。我之前在 Stack Overflow 上从编程的角度写过这篇文章这里这里

我将从非编程的角度总结一下:

  • 定义你的重复模式当地的时间 -非 UTC。例如,如果您设置了每天早上 8:00 的闹钟,您肯定不希望在夏令时转换后早起一小时或晚起一小时。如果我在美国太平洋时区,我无法安排下午 4:00 UTC 时间,因为转换后它必须切换到下午 3:00 UTC 时间才能保持相同的上午 8:00 当地时间。

  • 定义“本地”时间所代表的时区。不要假设服务器的本地时区与最终用户所关心的时区相同。

  • 项目将您希望事件触发的每个事件的当地时间转换为 UTC 日期和时间。

    • 您几乎总是会对下一次立即发生的事件执行此操作,这样您就可以使用 UTC 时钟来确定实际运行的时间。

    • 一些在某些情况下,您可能还想预测接下来的几个(或很多)实例,例如接下来的 5 次发生,或明年的所有发生。(这部分高度特定于应用程序的要求。)

  • 制定一个策略(固定或可配置),用于处理在发生夏令时过渡:

    • 对于“春季向前”过渡,存在缺少当地时间的间隙,此时事件可能不存在。例如,在美国太平洋时间,计划于当地时间凌晨 2:00 运行的每日任务在 2014 年 3 月 9 日将不存在。在大多数情况下,您需要将该时间提前节省量(通常为 1 小时),因此在那一天它将在凌晨 3:00 运行,但下次运行将在凌晨 2:00 重新运行。(但是,您完全有可能希望为此采用不同的策略。)

    • 对于“回退”过渡,当发生事件时可能会出现重复的本地时间重叠两次例如,在美国太平洋时间,计划在凌晨 1:00 运行的日常任务在 2014 年 11 月 2 日有两个可能的时间运行。在大多数情况下,您希望在第一的太平洋夏令时间凌晨 1:00 的事件,并跳过同一日期的下一个太平洋标准时间凌晨 1:00 事件。(但同样,您可能想要一个不同的策略,比如在第二次出现时运行,或者在两次出现时运行。YMMV)

  • 做好准备重新计算如果您需要更新时区数据,请记录所有发生的 UTC 时间。IANA/奥尔森 TZDB每年都会发布多次更新,因为世界各国政府经常改变其时区偏移和夏令时规则。 你不能假设在未来的某个特定时间段内规则不会改变

    • 务必订阅公告时区数据发布,并有一个将其应用到您的系统和/或应用程序的过程。

    • 在传统的公司环境中,这应该是 IT 运营人员的责任。

    • 根据您的环境,您可能通过tzdataLinux 软件包更新获取此数据,通过Java JRE 或 tzupdater或任何其他渠道。有时是环境特定的,有时是编程平台特定的,例如PHP 的 timezonedb PECL 包,还有其他许多人。

    • Microsoft 有自己的时区数据。在 Windows 上,如果您使用TimeZoneInfo.NET(例如),则正在使用此数据。更新来自这里,并且也会通过 Windows 更新自动推出,因此您应该留意这些,以便知道何时/是否需要重新计算。

  • 理解了这一切之后,仍然有一个场景,你只需要按照 UTC 来安排,那就是绝对未来事件。例如:

    • 每 X 小时或每 X 分钟运行一次的作业。

    • 日出开始和结束时间,或其他天文现象。

    • 时间敏感的安全窗口,例如在预定的时间向另一方传输敏感信息时。


Windows 任务计划程序

Windows 不一定做对了。请注意如何定义触发器:

Windows 任务计划程序

当您选中“跨时区同步”复选框时,任务将仅按 UTC 进行安排。(所有时间仍显示为当地时间,但存储为 UTC。)这就是我之前所说的“绝对”事件。

如果您不选中该框,它将使用代码运行所在计算机的本地时区。它不提供任何指定时区的选项,所以在我看来这不是一个很好的实现。

我不太确定它的 DST 行为,但我会进行实验并回复您。它可能按照我上面描述的方式运行,但不一定。


SQL代理

SQL 代理调度程序甚至更糟糕,因为它仅有的让您使用本地服务器时间。同样,不能指定时区,也不能指定 UTC。

它一直请求,但没有被接受。

答案2

一般情况下,不关心。

提出问题“如果任务运行两次会怎样?”

一般来说,这不会有什么影响,所以你不需要做任何事情。如果这有影响,最简单的解决方案就是将工作移出受夏令时影响的时间段。

答案3

正如您所指出的,凌晨 1 点到凌晨 2 点之间的时间在夏令时结束时重复;当发生反向变化(夏令时开始时)时,凌晨 2 点到凌晨 3 点之间的时间将不会发生(并且您的作业将不会运行)。您最好的选择是

  • 按照 UTC 时间运行作业
  • 在转换时间之外运行作业(凌晨 12:59 或凌晨 3 点)

相关内容