tanggal - tahun sebelum 1901 dianggap tidak valid

11

Saya memiliki tanggal (GNU coreutils) 7.1 diinstal pada sistem saya.

Jika saya mencoba memeriksa tanggal sebelum 14-Des-1901, saya mendapatkan kesalahan "tanggal tidak sah". Sebagai contoh,

  $ date -d 1901-12-13
  date: invalid date `1901-12-13'

  $ date -d 1901-12-14
  Sat Dec 14 00:00:00 EST 1901

Apa yang harus saya lakukan agar dateutilitas untuk memperlakukan tahun sebelum 1901 valid?

Saya menerima kesalahan serupa untuk tanggal setelah 19-Jan-2038

Jasdeep Singh
sumber
Saya tidak menerima kesalahan. Saya menggunakan coreutils 8.10, mungkin bug lama?
xenoterracide
@xenoterracide apakah Anda sistem 64-bit?
Mikel
@ Kemungkinan ya, saya
xenoterracide

Jawaban:

15

Pertanyaan bagus.

The dokumentasi mengatakan itu harus diperbolehkan.

 info date 'Date input formats' 'Calendar date items'

Untuk bulan numerik, format ISO 8601 `YEAR-MONTH-DAY 'diperbolehkan, di mana YEAR adalah angka positif, ...

Angka nol di depan harus ada jika jumlahnya kurang dari sepuluh.

Jika YEAR 68 atau lebih kecil, maka 2000 ditambahkan ke dalamnya; jika tidak, jika TAHUN kurang dari 100, maka 1900 ditambahkan ke dalamnya.

Apakah Anda menggunakan sistem 32-bit?

Apakah Anda mendapatkan kesalahan dengan tanggal setelah 2038-01-20 juga, mis

date -d '2038-01-20'

Jika demikian, sepertinya tanggal GNU menggunakan nilai waktu 32-bit.

Saya tidak yakin bagaimana Anda bisa memperbaikinya selain menggunakan sistem 64-bit atau menggunakan alat yang berbeda, misalnya DateTime dalam Perl atau datetime dengan Python.

Beberapa latar belakang:

Waktu unix menghitung jumlah detik dari 1 Januari 1970 menggunakan nilai integer. Jika sistem menggunakan bilangan bulat 32-bit, itu hanya dapat menghitung maju 2,1 miliar detik (hingga 2038-01-19 03:14:02 UTC) dan 2,1 miliar detik mundur (kembali ke 1901-12-13 20:45:52 UTC).

Informasi lebih lanjut di:

Mikel
sumber
Terima kasih Mikel, saya percaya bahwa saya menggunakan mesin 32 bit. Sebenarnya, saya sedang bekerja server jauh dan server tidak akan mengungkapkan banyak informasi bahkan dengan unameperintah kecuali fakta bahwa ia mengatakan itu mesin i686, yang saya anggap mesin 32 bit. Adapun masalah 2038, ya, masalah itu ada sebenarnya di server jauh. Sekali lagi terima kasih atas masukan Anda! Sangat dihargai !!
Jasdeep Singh
Ya, i686 adalah 32-bit. Senang untuk membantu. Jika Anda perlu bantuan untuk menangani tanggal yang lebih lama dari itu, coba modul Python dan Perl yang saya sarankan, dan posting pertanyaan lain jika Anda tidak bisa membuatnya bekerja.
Mikel
7

Sistem Anda (atau setidaknya versi tanggal itu ) mungkin menggunakan nilai waktu internal 32-bit.

Masa Unix (nilai waktu nol) adalah 1970-01-01 00:00:00 UTC. Titik awal ini menempatkan 1901-12-13 00:00 EST tepat di luar kisaran nilai waktu 32-bit yang ditandatangani.

1901-12-14 00:00:00 EST adalah -2147454000
1901-12-13 15:45:52 EST adalah -2147483648 (alias INT_MINdalam C, bilangan bulat bertanda minimum 32-bit)
1901-12-13 00:00: 00 EST adalah -2147540400

Anda dapat mencoba menggunakan 1901-12-13 15:45:52 EST. Seharusnya berfungsi, tetapi satu detik sebelumnya mungkin akan gagal dengan cara yang sama seperti 1901-12-13 00:00.

Chris Johnsen
sumber