この日が DST 変更日であり、その方向がどこであるかを確認する Linux コマンドはありますか?

この日が DST 変更日であり、その方向がどこであるかを確認する Linux コマンドはありますか?

現在、機器の時計を同期するソリューションを設計しています。機器の電源を切った後、電源を入れるたびに、時計は正確に「01:01」になります。この機器を同期するために、NEXA リモート スイッチと Telldus duo を用意しました。Telldus duo は、GPS と PPS ソースを備えた NTP サーバーであるサーバーに接続されています。

さて、問題は次のとおりです。現在、クロックは、01:00 にスケジュールされた電源をオフにし、その後 01:01 に電源をオンにするだけで同期され、機器のクロックは常に正確になります。

しかし、問題は DST 変更日にあります。DST 変更日に時計を 02:00 から 03:00 に 1 時間進める必要があると指定されている場合、機器の時計は 1 日で 1 時間遅れることになります。DST 変更日に時計を 1 時間戻す必要があると指定されている場合、機器は 1 時間早く動作することになります。

したがって、DST FORWARD 日には、機器を 00:00 にオフにして 00:01 にオンにするようにスケジュールする必要があります。すると、時計が 00:01 のときに機器は 01:01 になります。時計が 02:00 で 03:00 に変更されると、機器はすでに 03:00 になっているため、機器の時計が 2 時間だけ不正確になります。

また、DST が戻る日には、機器を 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 バックの日、4 時間であれば NO-DST 日、5 時間であれば DST フォワードの日であることを確認できます)

そのようなコマンドのアイデアを持っている人はいますか?

答え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

Linux ターミナル用の簡単な夏時間検出コマンドを探して Google 経由でここに来た人がいるなら、これで十分です。ただし、これは OP の質問には十分複雑ではありません。

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

*Perlのlocaltimeの出力の8番目の要素は$isdstですローカルタイム関数

答え3

システムに、正確に 24 時間で時間をどのように印刷するかを尋ねます。

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

注意: これを正時ちょうどに実行しないでください...

関連情報