Mengapa 2 perintah tanggal ini memberikan hasil yang berbeda?

9
$ date -d "Apr 1 2016 - 1 month" +%B

memberi saya "Maret", yang hebat - bulan yang datang sebelum April adalah Maret. Namun jika saya melakukan ini:

$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B

itu memberi saya "Februari". Ini menyebabkan bug pada beberapa kode yang lebih kompleks yang saya miliki. Mengapa 2 perintah ini menunjukkan hasil yang berbeda?

Tal
sumber
Keduanya memberi sayaMarch
cuonglm
1
Seperti dijelaskan oleh Thomas, ini tergantung pada zona waktu Anda. DST saya berubah pada 13 Maret - milik Anda mungkin tidak, jadi Anda mungkin tidak melihat perilaku ini pada tanggal yang sama, atau mungkin sama sekali jika Anda tidak memiliki perubahan DST.
Tal

Jawaban:

11

Anda dapat melihat masalahnya dengan menyalakan jejak shell:

+ date -d 'Apr 1 2016 - 1 month' +%B
March
++ date -d 'Apr 1 2016'
+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month' +%B
February

Ketika Anda menggunakan output dari dateperintah dalam , itu adalah di awal April, dan ketika mengurangi sebulan berjalan ke diskontinuitas karena perubahan EST / EDT:

+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016

Hasil Anda, tentu saja, akan bervariasi sesuai dengan pengaturan zona waktu lokal Anda. Mengaktifkan jejak akan menampilkan zona waktu (dalam kasus saya, EDT).

Alasan mengapa hasilnya berbeda adalah bahwa dalam kasus terakhir Anda telah memberikan lebih banyak informasi kepada date, menjadikan parameternya lebih spesifik , yaitu waktu waktu tertentu. Pada bagian pertama, itu tidak ditentukan, memberikan datelebih banyak kelonggaran tentang bagaimana menentukan tanggal / waktu untuk ditampilkan.

Thomas Dickey
sumber
Saya sekarang menyadari bahwa ini ada hubungannya dengan penghematan waktu siang hari (milik saya ada di sini: timeanddate.com/time/zone/canada/edmonton ), tapi saya masih tidak mengikuti mengapa perintah tanggal tampaknya menafsirkan tanggal yang sama secara berbeda dalam subkulit daripada di shell utama. Jika saya menjalankan skrip dengan:, date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")"saya mendapatkan hasil yang persis sama, termasuk tag zona waktu yang sama - mengapa menghapus satu bulan dari keduanya memberikan hasil yang berbeda?
Tal
Oh - hasil edit terakhir Anda membuatnya jelas. Terima kasih
Tal