at
就在昨天凌晨 2:40,我碰巧正在闲逛。 (不要问...)我尝试将事件安排在未来一分钟(作为测试),但是 - 它只是没有发生。事件本来就在队列中,但在 2:41 时它们只是停留在那里,没有发生任何事情。我放弃了,上床睡觉了。
发生了什么事?嗯 – 结果今天挪威夏令时结束了,所以今晚 2:41 确实发生了两次!果然,在第二一场(即从夏季时间来看是 3 点 41 分),at
然后开始那些预定的活动。
这是如何运作的?为什么以及如何调度意识到时间变化,并选择第二个时间,而不是在时间经过指定时间时才执行?
答案1
at
mktime()
尝试解析给定的日期和时间,并在“夏令时”设置为 -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
,无论时间更改与否,该表达式都会在下一分钟运行。