Calcola giorni dall'1 / 1/1970


10

Come si calcola il numero di giorni dall'1 / 1/1970? Questo serve per aggiornare l' attributo shadowLastChange su OpenLDAP.

C'è un modo per farlo usando il comando linux date ?


In Bash e nelle più moderne conchiglie derivate da Bourne, $()è preferito rispetto ai backtick per la leggibilità e altri motivi . echo $(( $(date ...) / 86400 ))
In pausa fino a ulteriore avviso.

Non ne ho ancora 2000 ... qualcuno può modificare e correggere il titolo :-)
Anello Ø

Risposte:


20

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.


1
che dire dei secondi bisestili? :)
netvope,

1
@netvope Dopo un ulteriore salto di secondo, il tempo di unix viene nuovamente ripristinato di uno. Quindi ogni giorno aggiunge esattamente 86400 secondi unix. Tuttavia, il tempo unix 915148800 può indicare sia UTC 1998-12-31T23: 59: 60 che 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski

9

Il datecomando può darti il ​​numero di secondi da allora 1970-01-01 00:00:00 UTC.

  date +"%s"

È possibile dividere il risultato 3600*24per ottenere il numero di giorni (UTC).

Ad esempio a Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

per visualizzare il numero di giorni.


9

Penso che questo sia il metodo più semplice:

expr $(date +%s) / 86400

Perché questo è downvoted? È la risposta migliore, più breve e più semplice
Tom Corelis,

1

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 +%-:::zprodurrà un errore "carattere non valido nell'espressione" quando utilizzato nell'istruzione precedente.

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.