`at` 如何知道时间会发生变化?

`at` 如何知道时间会发生变化?

at就在昨天凌晨 2:40,我碰巧正在闲逛。 (不要问...)我尝试将事件安排在未来一分钟(作为测试),但是 - 它只是没有发生。事件本来就在队列中,但在 2:41 时它们只是停留在那里,没有发生任何事情。我放弃了,上床睡觉了。

发生了什么事?嗯 – 结果今天挪威夏令时结束了,所以今晚 2:41 确实发生了两次!果然,在第二一场(即从夏季时间来看是 3 点 41 分),at然后开始那些预定的活动。

这是如何运作的?为什么以及如何调度意识到时间变化,并选择第二个时间,而不是在时间经过指定时间时才执行?

答案1

atmktime()尝试解析给定的日期和时间,并在“夏令时”设置为 -1(不可用,自动检测)的情况下运行它。

at源代码:

  tm1.tm_isdst = -1;
  t = mktime (&tm1);

man 3 mktime

tm_isdst 字段中指定的值通知 mktime() 对于 tm 结构中提供的时间,夏令时 (DST) 是否有效:正值表示 DST 有效;零表示 DST 未生效;负值意味着 mktime() 应该(使用时区信息和系统数据库)尝试确定 DST 在指定时间是否生效。

mktime() 函数修改 tm 结构的字段如下: [...] tm_isdst 分别设置(无论其初始值如何)为正值或 0,以指示 DST 是否有效在指定的时间。

因此mktime()决定DST是否生效;并且它似乎在两种可能的选择中更喜欢较晚的日期(尽管从文档中不清楚如何做出该决定)。

at然后将其转换为 UNIX 时间戳(自 1970 年 1 月 1 日以来的秒数)。一旦你有了这个,就不再有时间改变之类的事情了。将时钟来回调整一小时只会改变人类对时间的表示,或者您所在的时区;它不会更改自纪元以来的秒数,也不会更改任务运行之前的秒数。


我尝试将事件安排在未来一分钟(作为测试)

顺便说一句,您可以使用类似 的表达式next minute,无论时间更改与否,该表达式都会在下一分钟运行。

相关内容