我想知道其他人如何处理这种情况。
如果您有工作计划在凌晨1:30运行,该怎么办。在秋天,随着时间的变化,从1:00:00到1:59:59的时间重复进行,因此作业将运行两次。
可以是Windows Task Scheduler,SQL Agent或任何其他计划工具。这些工具中的大多数似乎是基于机器时间而不是UTC时间。如果我告诉它每天晚上UTC时间执行任务,那么我就不会遇到重复的小时问题。
我想知道其他人如何处理这种情况。
如果您有工作计划在凌晨1:30运行,该怎么办。在秋天,随着时间的变化,从1:00:00到1:59:59的时间重复进行,因此作业将运行两次。
可以是Windows Task Scheduler,SQL Agent或任何其他计划工具。这些工具中的大多数似乎是基于机器时间而不是UTC时间。如果我告诉它每天晚上UTC时间执行任务,那么我就不会遇到重复的小时问题。
Answers:
考虑到时区和夏时制,按当地时间正确安排将来的任务是一个非常复杂的主题。我以前从这里和这里的 Stack Overflow的编程角度写过它。
我将从非编程角度进行总结:
通过本地时间而非UTC定义您的复发模式。例如,如果您设置每日闹钟每天在8:00 AM唤醒您,则您不希望在夏令时过渡后早一小时或晚一小时醒来。如果我位于美国太平洋时区,则无法安排UTC下午4:00,因为在转换后,它必须切换到UTC下午3:00,以保持当地时间上午8:00。
定义“本地”时间代表的时区。不要假设服务器的本地时区与最终用户的时区相同。
项目本地时间到UTC日期和时间,您希望事件火灾每次出现。
您几乎总是会在下一个立即发生的情况下执行此操作,以便可以使用UTC时钟来确定实际的运行时间。
在某些情况下,您可能还希望预测接下来的几个(或多个)实例,例如接下来的5个实例,或下一年的所有实例。(这部分是针对应用程序要求的。)
制定策略(固定的或可配置的)以应对夏时制过渡时发生的事件:
对于“春季向前”过渡,当发生这种情况可能不存在时,会缺少本地时间间隔。例如,在美国太平洋时间,计划在当地时间凌晨2:00运行的每日任务在2014年3月9日将不存在。在大多数情况下,您希望将时间提前节省的时间(通常为1小时) ),因此该日期将在凌晨3:00运行,但在下一个实例中将恢复为凌晨2:00运行。(但是,您完全有可能为此选择其他策略。)
对于“后退”过渡,当事件可能存在两次时,存在重复的本地时间重叠。例如,在美国太平洋时间,计划在1:00 AM运行的每日任务将有两次可能在2014年11月2日运行的时间。在大多数情况下,您希望在第一次出现1时运行PDT:00 AM,然后跳过同一日期的下一次1:00 AM PST。(但同样,您可能想要一个不同的策略,例如在第二次出现时运行,或在两者中运行。
如果您需要更新时区数据,请准备好重新计算所有发生的UTC时间。该IANA /奥尔森TZDB每年推出多项更新,因为世界改变他们的想法对他们的时区偏移和夏令时规则的所有时间的政府。 您不能在将来的任何特定时间段内假设规则不会更改。
在传统的公司环境中,这应该由IT运营人员负责。
根据您的环境,您可能会通过tzdata
linux软件包更新,Java JRE或tzupdater或任何其他渠道来获取此数据。有时是特定于环境的,有时是特定于编程平台的,例如用于PHP的timezonedb PECL软件包,以及许多其他工具。
微软拥有自己的时区数据。在Windows上,TimeZoneInfo
例如,如果使用的是.NET,则使用的是此数据。更新来自此处,并且也会通过Windows Update自动推出,因此您应密切注意那些更新,以便知道何时/是否需要重新计算。
所有这一切的理解,还有就是还是这样一个场景,你会通过UTC只是计划,这是绝对的未来事件。例子:
每X个小时或每X分钟运行一次的作业。
日出开始和结束时间或其他天文现象。
时间敏感的安全窗口,例如在预定时间将敏感信息传输到另一方时。
Windows不一定做正确的事。请注意如何定义触发器:
选中标有“跨时区同步”的框时,则仅由UTC安排任务。(所有时间仍显示为本地时间,但存储为UTC。)因此,这是我之前所说的“绝对”事件。
取消选中该框时,它将使用运行代码的计算机的本地时区。它没有给您指定时区的任何选择,因此,恕我直言,这不是一个很好的实现。
我不确定这是DST的行为,但我会尝试并就此向您回复。它可能会执行我上面描述的操作,但不一定。
SQL Agent调度程序甚至更糟,因为它仅允许您使用本地服务器时间。同样,不能指定任何时区,您也不能指定UTC。
已请求,但未接受。
通常不关心。
问一个问题:“如果任务运行两次,该怎么办?”
通常,这无关紧要,因此您无需执行任何操作。如果这很重要,最简单的解决方案是将工作移出受夏令时更改影响的时间。