data - lata sprzed 1901 są traktowane jako nieważne

11

Mam datę (GNU coreutils) 7.1 zainstalowaną w moim systemie.

Jeśli spróbuję sprawdzić daty przed 14 grudnia 1901 r., Pojawia się błąd „nieprawidłowa data”. Na przykład,

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

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

Co powinienem zrobić, aby datenarzędzie do traktowania lat sprzed 1901 było ważne?

Otrzymuję podobne błędy dla dat po 19 stycznia 2038 r

Jasdeep Singh
źródło
Nie otrzymuję błędu. Używam coreutils 8.10, może stary błąd?
ksenoterrakid
@ xenoterracide czy jesteś systemem 64-bitowym?
Mikel
@Mikel tak, jestem
ksenoterracid

Odpowiedzi:

15

Dobre pytanie.

Dokumentacja mówi, powinno być dozwolone.

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

W miesiącach numerycznych dozwolony jest format ISO 8601 „ROK-MIESIĄC-DZIEŃ”, gdzie ROK jest dowolną liczbą dodatnią, ...

Zera wiodące musi być obecne, jeśli liczba jest mniejsza niż dziesięć.

Jeśli ROK ma 68 lat lub mniej, wówczas dodaje się do niego 2000; w przeciwnym razie, jeśli ROK jest mniejszy niż 100, wówczas dodaje się do niego 1900.

Czy korzystasz z systemu 32-bitowego?

Czy pojawia się również błąd z datami po 2038-01-20, np

date -d '2038-01-20'

Jeśli tak, to wygląda na to, że data GNU używa 32-bitowej wartości czasu.

Nie jestem pewien, jak możesz to naprawić, używając systemu 64-bitowego lub innego narzędzia, na przykład DateTime w Perlu lub datetime w Pythonie.

Niektóre tło:

Czasy Unix liczą liczbę sekund od 1 stycznia 1970 roku, używając wartości całkowitej. Jeśli system używa 32-bitowych liczb całkowitych, może liczyć tylko 2,1 miliarda sekund do przodu (do 2038-01-19 03:14:02 UTC) i 2,1 miliarda sekund do tyłu (do 1901-12-13 20:45:52 UTC).

Więcej informacji na:

Mikel
źródło
Dzięki Mikel, wierzę, że jestem na komputerze 32-bitowym. W rzeczywistości pracuję na serwerze zdalnym, a serwer nie ujawni wielu informacji nawet za pomocą unamepolecenia, z wyjątkiem faktu, że mówi, że jest to komputer i686, który, jak zakładam, jest 32-bitowy. Jeśli chodzi o problem z 2038 r., Tak, problem ten istnieje na zdalnym serwerze. Jeszcze raz dziękuję za Twój wkład! Bardzo mile widziane !!
Jasdeep Singh
Tak, i686 jest 32-bitowy. Miło, że mogłem pomóc. Jeśli potrzebujesz pomocy w radzeniu sobie z datami starszymi, wypróbuj sugerowane przeze mnie moduły Python i Perl i zadaj kolejne pytanie, jeśli nie możesz go uruchomić.
Mikel
7

Twój system (lub przynajmniej ta wersja daty ) prawdopodobnie używa 32-bitowej wewnętrznej wartości czasu.

Epoka uniksowa (wartość czasu zero) to 1970-01-01 00:00:00 UTC. Ten punkt początkowy stawia 1901-12-13 00:00 EST tuż poza zakresem 32-bitowej wartości ze znakiem.

1901-12-14 00:00:00 EST to -2147454000
1901-12-13 15:45:52 EST to -2147483648 (aka INT_MINw C, minimalna 32-bitowa liczba całkowita ze
znakiem ) 1901-12-13 00:00: 00 EST to -2147540400

Możesz spróbować użyć 1901-12-13 15:45:52 EST. Powinno działać, ale sekunda wcześniej prawdopodobnie zawiedzie w taki sam sposób jak 1901-12-13 00:00.

Chris Johnsen
źródło