data - anni precedenti al 1901 sono considerati non validi


11

Ho installato (GNU coreutils) 7.1 sul mio sistema.

Se provo a controllare le date precedenti al 14-dic-1901, visualizzo un errore "data non valida". Per esempio,

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

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

Cosa devo fare per rendere datevalida l' utilità di trattare anni prima del 1901?

Ricevo errori simili per le date successive al 19 gennaio 2038


Non ricevo alcun errore Sto usando coreutils 8.10, forse un vecchio bug?
xenoterracide,

@xenoterracide sei un sistema a 64 bit?
Mikel,

@Mikel sì, lo sono
xenoterracide,

Risposte:


15

Buona domanda.

La documentazione dice che dovrebbe essere permesso.

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

Per mesi numerici, è consentito il formato ISO 8601 "ANNO-MESE-GIORNO", dove ANNO è un numero positivo, ...

Uno zero iniziale deve essere presente se un numero è inferiore a dieci.

Se ANNO è 68 o inferiore, viene aggiunto 2000; in caso contrario, se ANNO è inferiore a 100, viene aggiunto 1900.

Sei su un sistema a 32 bit?

Viene visualizzato un errore anche con le date successive al 2038-01-20, ad es

date -d '2038-01-20'

In tal caso, sembra che la data GNU stia utilizzando un valore temporale a 32 bit.

Non sono sicuro di come risolverlo se non usando un sistema a 64 bit o usando uno strumento diverso, ad esempio DateTime in Perl o datetime in Python.

Alcuni retroscena:

I tempi Unix contano il numero di secondi dal 1 ° gennaio 1970 utilizzando un valore intero. Se il sistema utilizza numeri interi a 32 bit, può contare solo 2,1 miliardi di secondi in avanti (fino a 2038-01-19 03:14:02 UTC) e 2,1 miliardi di secondi all'indietro (fino al 1901-12-13 20:45:52 UTC).

Maggiori informazioni su:


Grazie Mikel, credo di essere su una macchina a 32 bit. In realtà, sto lavorando a un server remoto e il server non rivelerà molte informazioni anche con unamecomando tranne il fatto che dice che è una macchina i686, che presumo siano macchine a 32 bit. Per quanto riguarda il problema del 2038, sì, quel problema è presente nel server remoto. Grazie ancora per il tuo contributo! Molto apprezzato!!
Jasdeep Singh,

Sì, i686 è a 32 bit. Felice di aiutare. Se hai bisogno di aiuto per gestire le date precedenti, prova i moduli Python e Perl che ho suggerito e pubblica un'altra domanda se non riesci a farlo funzionare.
Mikel,

7

Il tuo sistema (o almeno quella versione di data ) sta probabilmente usando un valore di tempo interno a 32 bit.

L'epoca Unix (valore zero time) è 1970-01-01 00:00:00 UTC. Questo punto di partenza pone 1901-12-13 00:00 EST appena al di fuori dell'intervallo di un valore temporale a 32 bit con segno.

1901-12-14 00:00:00 EST è -2147454000
1901-12-13 15:45:52 EST è -2147483648 (aka INT_MINin C, il numero intero con
segno minimo a 32 bit) 1901-12-13 00:00: 00 EST è -2147540400

Puoi provare a usare 1901-12-13 15:45:52 EST. Dovrebbe funzionare, ma un secondo prima probabilmente fallirà allo stesso modo del 1901-12-13 00:00.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.