今日、私の時計は夏時間で自動的に調整され、crontabのスクリプトが失敗し始めました。何が起こっているのかを調べると、次のエラーが表示されますLC_ALL=C
。
日付: 無効な日付 "2016-10-16"
システムを再起動するのが最善だと思いましたが、今再起動しましたが、エラーが表示され続けます。
$ date -d '2016-10-15'
Sat Oct 15 00:00:00 BRT 2016
$ date -d '2016-10-16'
date: data inválida “2016-10-16”
$ date -d '2016-10-17'
Mon Oct 17 00:00:00 BRST 2016
原因は何ですか?
答え1
問題は、その時間帯の夏時間が変更され、2016年10月16日に1時間早められたということです。
$ zdump -v America/Sao_Paulo | awk '/Oct 16/ && /2016/'
America/Sao_Paulo Sun Oct 16 02:59:59 2016 UTC = Sat Oct 15 23:59:59 2016 BRT isdst=0
America/Sao_Paulo Sun Oct 16 03:00:00 2016 UTC = Sun Oct 16 01:00:00 2016 BRST isdst=1
00:00
したがって、00:59
今日から今日までのすべての時間は、そのタイムゾーンでは無効と見なされます(ただし、他のタイムゾーンでは有効です)。
$ TZ=America/Sao_Paulo gdate -d '2016-10-16 0:59'
gdate: invalid date ‘2016-10-16 0:59’
$ TZ=Asia/Ho_Chi_Minh gdate -d '2016-10-16 0:59'
Sun Oct 16 00:59:00 ICT 2016
追加時間を設定できますが、この範囲内では設定できません。
$ TZ=America/Sao_Paulo gdate -d '2016-10-16 1:00'
Sun Oct 16 01:00:00 BRST 2016
上記はGNU日付動作です。
BSDの日付にはこの問題はありません。入力した日付がタイムゾーンで無効な場合、有効な時間に達するまで自動的に1時間前に調整されます。
$ TZ=America/Sao_Paulo date -j -f '%Y%m%d%H%M' 201610160000
Sun Oct 16 01:00:53 BRST 2016