Mengapa ada perbedaan dengan tanggal Unix antara 2 dan 3 bulan


16

Bagaimana ini mungkin dan bagaimana saya menghadapinya? Saya membuat skrip cadangan yang bergantung pada Unix datedan telah menemukan bug yang menarik:

[root@web000c zfs_test]# date +%y-%m-%d --date='2 months ago'
14-04-01
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-02-28
[root@web000c zfs_test]# date
Sun Jun  1 00:08:50 CEST 2014

Mungkinkah itu tahun kabisat / 29 Februari? Tidak mungkin dalam alat seperti date...
Mark Henderson

Jawaban:


44

Anda melihat perilaku ini karena waktu musim panas (waktu musim panas).

Karena Anda saat ini berada di musim panas, di mana jam Anda lebih unggul satu jam, ketika Anda meminta tiga bulan yang lalu tepat setelah tengah malam pada tanggal 1 Juni, waktu berakhir menjadi satu jam "lebih awal" karena itu bukan waktu musim panas tiga bulan lalu.

Dokumentasi tanggal GNU menyarankan untuk mengatasinya dengan menggunakan 12:00 siang dan tanggal 15 bulan sebagai titik awal, ketika masing-masing meminta hari atau bulan relatif. Sebagai contoh:

date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"

Terima kasih. Ya, tepat "3 bulan yang lalu" datang pukul 01:00:[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago' 14-03-01 [root@web000c zfs_test]# date Sun Jun 1 01:00:15 CEST 2014
Shirker

Doh! Saya pikir saya perlu membaca beberapa skrip saya karena saya curiga saya mengabaikan saran datepenggunaan ini.
Caleb

14

Jika penetapan waktu absolut menjadi perhatian utama Anda, mungkin yang terbaik adalah mematikan UTC karena ada untuk tujuan itu. Jawaban Michael sangat berguna ketika Anda harus bekerja di dalam masalah, tetapi biasanya itu ide yang baik untuk menghindarinya sepenuhnya di mana Anda bisa.

Ketika sistem Anda tidak diatur ke UTC secara default, cara termudah untuk melewatkan zona waktu adalah dengan mengawali perintah Anda dengan TZvariabel lingkungan. Ini membatasi pergantian zona ke satu perintah dan menjaga variabel agar tidak bocor ke perintah berikutnya.

$ NOW=$(date '+%s')
$ date -d @$NOW
Wed Jun 11 23:44:35 EDT 2014
$ TZ=UTC date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014

Apa yang tidak boleh Anda lakukan adalah mengekspor TZvariabel karena hal ini dapat membuat masalah menjadi sangat membingungkan, seperti ditunjukkan berikut ini.

$ export TZ=UTC
$ date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014
$ TZ=EDT date -d @$NOW
Thu Jun 12 03:44:35 EDT 2014

-3

Pada tahun ini komputer Anda berpikir sedang dioperasikan, dan pada tanggal tertentu Anda memilih untuk tes "1 bulan lalu, 2 bulan lalu, dan 3 bulan lalu, ya - kemungkinan deteksi 29 Februari. Tidak selalu kesalahan, tapi ..

Sekarang, hari ini BUKAN 2014-06-01. Coba lagi. Setel tanggal komputer ke 2013-06-01. Coba lagi.
Setel tanggal komputer ke 2014-09-01. Coba lagi.


6
Jika Anda memberikan tanggal dalam MDYformat Amerika , silakan gunakan /es untuk memisahkan. Lebih baik lagi, karena kami adalah komunitas internasional di sini, gunakan tanggal ISO yang tepat seperti 2014-09-01.
glglgl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.