Soluzione 1:
ring0 mi ha battuto di qualche secondo, ma il comando completo è:
echo $(($(date --utc --date "$1" +%s)/86400))
Questo va in base all'ora UTC. Risultato:
[email protected]:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Un rapido controllo con WolframAlpha mostra che questo è il valore corretto.
Soluzione 2:
Penso che questo sia il metodo più semplice:
expr $(date +%s) / 86400
Soluzione 3:
Il date
comando può darti il numero di secondi trascorsi da 1970-01-01 00:00:00 UTC
.
date +"%s"
Puoi dividere il risultato per 3600*24
per ottenere il numero di giorni (UTC).
Per esempio. in Bash
x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))
per visualizzare il numero di giorni.
Soluzione 4:
Avevo bisogno di risolvere anche questo, ma volevo ottenere lo stesso valore per day# indipendentemente dall'ora del giorno. Con approcci come quelli mostrati qui, il valore cambierà a mezzanotte UTC anziché a mezzanotte ora locale. Questo probabilmente sembra un problema minore nell'UE o nella costa orientale degli Stati Uniti, che sono abbastanza vicini all'UTC che il valore del giorno non cambierà nel mezzo della tipica giornata lavorativa, ma, ad esempio, in California, il giorno cambia avverrebbe alle 16:00 PST, il che potrebbe essere scomodo. Immagino che gli australiani sarebbero particolarmente infastiditi dal fatto che il valore del giorno cambi in tarda mattinata.
Se vogliamo correggerlo, dobbiamo aggiungere l'offset da UTC prima di dividere per secondi/giorno. Fortunatamente, il comando date di Linux include un %z sequenza di formato che riporta l'offset dall'ora UTC. Mentre il formato standard (questo risultato è per l'ora di Denver, MDT):
$ date +%z
-0600
. . . non è direttamente utilizzabile in un calcolo, i giusti modificatori produrranno ciò che vogliamo:
$ date +%-:::z
-6
Mettilo insieme alle solite conversioni secondi/ore/giorni, e credo che quanto segue dovrebbe produrre i giorni dall'1/1/1970, con lo stesso 1/1/1970 come giorno zero e il valore che aumenta a mezzanotte ora locale:
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
Questo semplice calcolo non funzionerà per i fusi orari che non sono sfalsati dall'UTC di ore intere (ad es. India, TZ=Asia/Kolkata), poiché il "+5:30" prodotto da date +%-:::z
produrrà un errore "carattere non valido nell'espressione" quando utilizzato nell'istruzione precedente.