Linux指令來檢查這一天是DST更改日以及哪個方向?

Linux指令來檢查這一天是DST更改日以及哪個方向?

我目前正在設計一個解決方案來同步設備上的時鐘。每次設備斷電後開啟時,其時鐘恰好為「01:01」。為了同步該設備,我有一個 NEXA 遠端開關和一個 Telldus duo。 Telldus duo 連接到一個伺服器,該伺服器是具有 GPS 和 PPS 來源的 NTP 伺服器。

現在解決問題:目前,時脈同步只需在 01:00 關閉電源,然後在 01:01 開啟電源,導致裝置上的時鐘始終保持正確。

但問題出在 DST 更改日。如果 DST 更改日規定時鐘應在 02:00 至 03:00 向前移動 1 小時,則裝置上的時鐘將在一整天內落後 1 小時。如果 DST 變更日規定時鐘應向後移動 1 小時,則設備運轉速度將快 1 小時。

因此,在 DST FORWARD 日,我需要安排設備在 00:00 關閉並在 00:01 開啟。那麼當時鐘為 00:01 時,設備將顯示為 01:01。當時鐘為 02:00 並變更為 03:00 時,裝置將已處於 03:00,因此裝置只會在 2 小時內出現錯誤時鐘。

在 DST BACK 日,我需要安排設備在 02:00 關閉並在 02:01 開啟。因此,當時鐘為 03:00 時,裝置將為 02:00,且 DST 會回到 02:00,因此在這種情況下,裝置的時鐘只會有 1 小時不正確。


我完全有能力編寫一個腳本來完成此任務,因為:

我知道一個命令,它可以告訴我,如果今天是 DST 更改的日子,以及它將發生在哪個方向(02:00 到 03:00,或 03:00 到 02:00)。

這意味著我需要一些專用的 DST 命令,或「展望未來」的可能性,例如「考慮到 DST,從現在起 4 小時過去後的時鐘是多少?」。 (然後我可以檢查,如果現在和返回的時鐘之間的差異是3小時,那麼它是DST-BACK日,4小時,那麼它是NO-DST日,5小時那麼它是DST-FORWARD日)

有人知道這樣的命令嗎?

答案1

嘗試:

$ zdump -v Europe/London  -c $(date '+%Y'),$(date -d '+1 year' '+%Y') | awk -v y=$(date '+%Y') '$6==y && $15~1 {print $4, $3, $6}'
30 Mar 2014
26 Oct 2014

它會列印 DST 更改的日期。將 變更Europe/London為您的時區。

或者,稍微長一點:

$ zdump -v Europe/London  -c $(date '+%Y'),$(date -d '+1 year' '+%Y') | awk -v y=$(date '+%Y') '
                                     ($6==y && dst=="") {dst=$15}
                                     ($6==y && dst==$15) {ftime=$12; dst=$15;}
                                     ($6==y && dst!=$15) {print ftime, "to", $12, "on", $4, $3, $6, $15; dst=$15}'
00:59:59 to 02:00:00 on 30 Mar 2014 isdst=1
01:59:59 to 01:00:00 on 26 Oct 2014 isdst=0

其中列印的時間也發生了變化。最後一列顯示您是否正在進入 DST(1表示進入 DST)。

答案2

如果有人透過 Google 來這裡尋找 Linux 終端機的簡單夏令時檢測命令,這就足夠了。然而,這對於OP的問題來說還不夠複雜。

if perl -e 'exit ((localtime)[8])' ; then
    echo no DST
else
    echo DST
fi

*perl中本地時間輸出中的第8個元素是$isdsthttp://perldoc.perl.org/functions/localtime.html

答案3

我只想問系統如何列印 24 小時內的時間:

now=$(date +%H)
then=$(date -d '24 hours' +%H)
dst_change=$(( then - now ))

注意,不要在整點運行這個...

相關內容