Perché c'è una differenza con la data Unix tra 2 e 3 mesi


16

Come è possibile e come posso gestirlo? Sto realizzando uno script di backup che dipende da Unix datee ho scoperto un bug interessante:

[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

Potrebbe essere un anno bisestile / 29 febbraio bug? Improbabile in uno strumento come datese ...
Mark Henderson

Risposte:


44

Stai vedendo questo comportamento a causa dell'ora legale (ora legale).

Poiché al momento sei in estate, dove l'orologio è un'ora avanti, quando chiedi tre mesi fa appena dopo la mezzanotte del primo giugno, l'ora finisce per essere un'ora "precedente" perché non era l'ora legale tre mesi fa.

La documentazione relativa alla data GNU suggerisce di aggirare il problema usando le 12:00 e il 15 del mese come punti di partenza, quando si chiedono rispettivamente giorni o mesi relativi. Per esempio:

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

grazie. Sì, esattamente "3 mesi fa" in arrivo [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
dall'01

Doh! Penso di dover esaminare alcuni dei miei script poiché sospetto di aver trascurato questo suggerimento datesull'uso.
Caleb,

14

Se la tempistica assoluta è la tua preoccupazione principale, probabilmente è meglio lavorare al di fuori di UTC come esiste a tale scopo. La risposta di Michael è molto utile quando devi lavorare all'interno del problema, ma di solito è una buona idea evitarlo del tutto dove puoi.

Quando il sistema non è impostato su UTC per impostazione predefinita, il modo più semplice per passare il fuso orario è prefissare il comando con la TZvariabile di ambiente. Ciò limita il cambio di zona a un singolo comando e impedisce la perdita della variabile nei comandi successivi.

$ 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

Quello che non dovresti fare è esportare la TZvariabile in quanto ciò può rendere le cose molto confuse per la risoluzione dei problemi, come dimostra quanto segue.

$ 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

In questo specifico anno in cui il tuo computer pensa di essere utilizzato e nella data specifica che hai scelto per un test di "1 mese fa, 2 mesi fa e 3 mesi fa, sì - è probabile che venga rilevato un 29 febbraio. Non sempre un errore, ma ..

Ora, oggi NON è il 01/06/2014. Riprova. Impostare la data del computer su 2013-06-01. Riprova.
Impostare la data del computer su 2014-09-01. Riprova.


6
Se si stanno fornendo date in MDYformato americano , si prega di utilizzare /es per la separazione. Ancora meglio, dato che siamo una comunità internazionale qui, utilizzare date ISO adeguate come 2014-09-01.
glglgl,
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.