Risposte:
ring0 mi ha battuto di qualche secondo, ma il comando completo è:
echo $(($(date --utc --date "$1" +%s)/86400))
Questo vale per l'ora UTC. Risultato:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Un rapido controllo con WolframAlpha mostra che questo è il valore corretto.
Penso che questo sia il metodo più semplice:
expr $(date +%s) / 86400
Avevo bisogno di risolvere anche questo, ma volevo ottenere lo stesso valore per il giorno # 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 bel mezzo della tipica giornata lavorativa, ma, ad esempio, in California, il cambiamento del giorno si verificherebbe alle 16:00 PST, il che potrebbe essere scomodo. Immagino che gli australiani sarebbero particolarmente infastiditi dall'aver cambiato il valore del giorno in tarda mattinata.
Se vogliamo correggerlo, dobbiamo aggiungere l'offset da UTC prima di dividere per sec / giorno. Fortunatamente, il comando data di Linux include una sequenza in formato % z che riporta l'offset da UTC. Mentre il formato standard (questo risultato è per l'ora di Denver, MDT):
$ date +%z
-0600
. . . non è direttamente utilizzabile in un calcolo, i modificatori giusti produrranno ciò che vogliamo:
$ date +%-:::z
-6
Mettilo insieme alle solite conversioni di secondi / ore / giorni e credo che quanto segue dovrebbe generare i giorni dall'1 / 1/1970, con 1/1/1970 stesso essendo il giorno zero e il valore che aumenta all'ora locale di mezzanotte:
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
Questo semplice calcolo non funzionerà per i fusi orari che non sono sfalsati rispetto all'ora UTC di intere ore (ad esempio, India, TZ = Asia / Calcutta), poiché il "+5: 30" prodotto da date +%-:::z
produrrà un errore "carattere non valido nell'espressione" quando utilizzato nell'istruzione precedente.
$()
è preferito rispetto ai backtick per la leggibilità e altri motivi .echo $(( $(date ...) / 86400 ))