at
怎麼知道會有時間變化?
我碰巧在
at
昨天凌晨 2 點 40 分左右閒逛。(不要問…)我嘗試在未來一分鐘安排活動(作為測試),但 - 它只是沒有發生。事件都在隊列中,但他們只是在 2 點 41 分的時候呆在那裡,沒有任何事情發生。我放棄了,去睡覺了。發生了什麼事?好吧 - 事實證明今天夏令時在挪威結束(夏令時),所以今晚確實發生了兩次 2:41!果然,在第二個(即從夏季時間看到的 3:41),
at
然後啟動了那些預定的事件。這是如何運作的?調度為什麼以及如何知道時間變化,並選擇第二次,而不是在時間超過指定時間時才這樣做?
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
,它將在下一分鐘執行,時間更改或否。