Perché questi 2 comandi di data danno risultati diversi?


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

mi dà "marzo", il che è fantastico - il mese che precede aprile è marzo. Se lo faccio comunque:

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

mi dà "febbraio". Questo sta causando un bug in qualche codice più complesso che ho. Perché questi 2 comandi mostrano risultati diversi?


Entrambi mi hanno datoMarch
cuonglm il

1
Come spiegato da Thomas, questo dipende dal tuo fuso orario. Il mio DST cambia il 13 marzo - probabilmente il tuo non lo è, quindi potresti non vedere questo comportamento nelle stesse date, o possibilmente se non hai cambiamenti DST.
Tal,

Risposte:


11

Puoi vedere il problema attivando la traccia della 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

Quando si utilizza l'output del datecomando interno , è all'inizio di aprile e quando si sottrae un mese si verifica la discontinuità a causa della modifica di EST / EDT:

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

I risultati, ovviamente, varieranno in base alle impostazioni del fuso orario locale. L'attivazione della traccia mostrerà il fuso orario (nel mio caso, EDT).

Il motivo per cui i risultati differiscono è che in quest'ultimo caso hai fornito maggiori informazioni date, ha reso il suo parametro più specifico , ovvero l'ora specifica del giorno. Nella prima parte, ciò non è stato specificato, dando datepiù margine di manovra su come determinare la data / ora da visualizzare.


Ora mi rendo conto che questo ha a che fare con l'ora legale (le mie sono qui: timeanddate.com/time/zone/canada/edmonton ), ma non sto ancora seguendo il motivo per cui il comando date sembra interpretare la stessa data in modo diverso in una subshell che nella shell principale. Se eseguo uno script con date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")":, ottengo esattamente lo stesso risultato, incluso lo stesso tag di fuso orario: perché rimuovere un mese da entrambi dà risultati diversi?
Tal,

Oh, la tua ultima modifica lo rende chiaro. Grazie
Tal
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.