Pesan kesalahan "date: date invalid '2016-10-16'"

35

Hari ini jam saya secara otomatis disesuaikan dengan waktu musim panas, dan skrip dari crontab mulai gagal. Saya telah melihat apa yang terjadi, dan kesalahan berikut ditampilkan, dengan LC_ALL=C:

tanggal: tanggal tidak valid '2016-10-16'

Saya pikir itu akan lebih baik hanya untuk reboot sistem, tetapi sekarang saya telah reboot, dan kesalahan masih muncul:

$ 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

Apa yang menyebabkan ini?

Teresa e Junior
sumber
Dari OS apa Anda menjalankan perintah ini? Tidak dapat mereproduksi pada Debian 8. Mencoba dengan dua locales berbeda : sv_SE.utf8dan en_us.utf-8.
maulinglawns
2
Pada jam berapa (malam) Brasil meneruskan jam ke waktu musim panas?
techraf
Saya pikir semua negara di mana pergeseran pada waktu yang terlambat, seperti 2 di pagi hari, di mana ia cenderung menyebabkan masalah.
njzk2

Jawaban:

57

Masalahnya adalah waktu musim panas berubah dan diteruskan 1 jam, pada 16 Oktober 2016 di zona waktu Anda:

$ 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

Jadi, setiap waktu antara 00:00hingga 00:59pada hari itu dianggap tidak valid di zona waktu Anda (tapi mungkin berlaku di tempat lain):

$ 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

Anda dapat mengatur waktu tambahan, yang tidak ada dalam rentang itu:

$ TZ=America/Sao_Paulo gdate -d '2016-10-16 1:00'
Sun Oct 16 01:00:00 BRST 2016

Di atas adalah perilaku tanggal GNU.

Tanggal BSD tidak memiliki masalah ini. Jika tanggal input tidak valid di zona waktu, itu akan disesuaikan secara diam-diam ke depan 1 jam sampai mencapai waktu yang valid:

$ TZ=America/Sao_Paulo date -j -f '%Y%m%d%H%M' 201610160000
Sun Oct 16 01:00:53 BRST 2016
cuonglm
sumber
1 jam dan 53 detik ?!
domen
Jadi itu menyesuaikan waktu 53 detik terlalu jauh ke depan? Atau apakah saya salah paham akan sesuatu?
domen
1
Aah, masuk akal; mempertahankan data yang tidak ditentukan (sebagai lawan kliring). Masih sedikit aneh karena menyesuaikan ke depan pada 00:59:07 akan cukup dalam hal ini.
domen