夏令时和 Cron

Posted

技术标签:

【中文标题】夏令时和 Cron【英文标题】:Daylight Savings and Cron 【发布时间】:2012-10-23 03:46:43 【问题描述】:

如果 Cron 有一个作业计划在凌晨 2 点运行,一个在凌晨 3 点运行,那么这些作业将如何受到夏令时的影响?

当时间倒退一小时时,时间是否直接从凌晨 2:59:59 转到凌晨 2:00:00?这意味着凌晨 2 点的作业将运行两次,而凌晨 3 点的作业将运行一次?还是时间先更改为凌晨 3:00:00,然后更改为凌晨 2:00:00 导致两个作业运行两次?

当时间向前移动一小时时,时间是否从凌晨 1:59:59 变为凌晨 3:00:00 会导致凌晨 2 点的作业无法运行而凌晨 3 点的作业只运行一次?还是时间从凌晨 2:00:00 转移到凌晨 3:00:00 导致两个作业都运行一次?

简而言之,我想知道的是,当增加一个小时时,凌晨 3 点会发生一次或两次,而失去一个小时,凌晨 2 点是否会发生。在 Google 上查看时,我无法找到任何相关信息。

【问题讨论】:

【参考方案1】:

答案将取决于您使用的 cron 的变体/扩展。某些变体不处理夏令时,导致作业丢失和作业两次运行。

如果您使用的是 Paul Vixie cron,那么它会处理 DST 更改。根据cron man page:

cron 每分钟检查一下它的假脱机目录是否 modtime(或 /etc/crontab 上的 modtime)已更改

此外,参考夏令时(第 2 段清楚地解释了您的答案)

夏令时和其他时间变化

   Local time changes of less than three hours, such as  those  caused  by
   the  start or end of Daylight Saving Time, are handled specially.  This
   only applies to jobs that run at a specific time and jobs that are  run
   with  a    granularity  greater  than  one hour.  Jobs that run more fre-
   quently are scheduled normally.

   If time has moved forward, those jobs that would have run in the inter-
   val that has been skipped will be run immediately.  Conversely, if time
   has moved backward, care is taken to avoid running jobs twice.

   Time changes of more than 3 hours are considered to be  corrections  to
   the clock or timezone, and the new time is used immediately.

因此,每当时间变化可能是 2:59:59 或 3:00:00 时,cron 会通过处理情况并仅运行错过的作业来处理作业,并避免运行已经运行的作业。

【讨论】:

链接已损坏。什么 Paul Vixie cron。我在网上一无所获。 这是一个指向不存在页面的存档的链接:web.archive.org/web/20130905110602/http://unixhelp.ed.ac.uk/CGI/…,这是一个托管 linux 手册页的当前站点:linux.die.net/man/8/cron【参考方案2】:

说清楚,这取决于你住在哪里,如何安排你的 cron 作业(你需要处理的 Unix cron,而 Java 调度程序自己处理!)。

在美国,时钟在当地时间凌晨 2:00 更改。在春天,时钟从凌晨 1:59 到凌晨 3:00 向前跳;在秋季,时钟从凌晨 1:59 回落到凌晨 1:00。

在欧盟,时钟在世界时间凌晨 1:00 更改。在春天,时钟从凌晨 12:59 到凌晨 2:00 向前跳;在秋季,时钟从凌晨 1:59 回落到凌晨 1:00。

示例:如果您在 2020 年 10 月 25 日今天凌晨 1:30 有一个 Unix cron 作业,那么您的作业会运行两次。

【讨论】:

从我的问题中应该清楚我在谈论哪个时间更改,因为我指定了更改前后的小时数。这也与接受的答案不同。

以上是关于夏令时和 Cron的主要内容,如果未能解决你的问题,请参考以下文章

如何为 cron 触发器处理石英夏令时的用户时区?

中国有夏令时和冬令时吗?

计算夏令时和非夏令时之间的时间差

UTC 时间、时区、夏令时和夏令时切换日期

LON 和 SYD 之间的时差为 9 小时,夏令时

仅从日期计算夏令时