Ho bisogno di qualcosa di semplice date
, ma in pochi secondi dal 1970 invece della data, ore, minuti e secondi attuali.
date
non sembra offrire questa opzione. C'è un modo semplice?
Ho bisogno di qualcosa di semplice date
, ma in pochi secondi dal 1970 invece della data, ore, minuti e secondi attuali.
date
non sembra offrire questa opzione. C'è un modo semplice?
Risposte:
Questo dovrebbe funzionare:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
a %s seconds since the epoch, 1970-01-01 00:00:00 UTC
perché l'ho persa lì dentro.
date
non è integrato bash
, quindi la tua versione bash
non ha nulla a che fare con l' date
implementazione fornita dal tuo sistema.
date +%s.%N
date +%s%3N
Solo per aggiungere.
Ottieni i secondi dall'epoca (1 gennaio 1970) per una determinata data (ad es. 21 ottobre 1973).
date -d "Oct 21 1973" +%s
Convertire il numero di secondi indietro alla data
date --date @120024000
Il comando date
è piuttosto versatile. Un'altra cosa interessante che puoi fare con la data (copiata senza vergogna date --help
). Mostra l'ora locale per le 9:00 di venerdì prossimo sulla costa occidentale degli Stati Uniti
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
Meglio ancora, prenditi del tempo per leggere la pagina man http://man7.org/linux/man-pages/man1/date.1.html
date
o perché sto usando zsh
(macOS Catalina) ma questo non funziona per me. $ date -d "Oct 21 1973" +%s
Uscite in esecuzioneusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Finora, tutte le risposte usano il programma esterno date
.
A partire da Bash 4.2, printf
ha un nuovo modificatore %(dateformat)T
che, se usato con argomento, -1
genera la data corrente con il formato dato da dateformat
, gestito da strftime(3)
( man 3 strftime
per informazioni sui formati).
Quindi, per una soluzione Bash pura:
printf '%(%s)T\n' -1
o se è necessario memorizzare il risultato in una variabile var
:
printf -v var '%(%s)T' -1
Nessun programma esterno e nessun subshells!
Da Bash 4.3, è anche possibile non specificare -1
:
printf -v var '%(%s)T'
(ma potrebbe essere più saggio dare sempre l'argomento -1
).
Se si utilizza -2
come argomento anziché -1
, Bash utilizzerà l'ora di avvio della shell anziché la data corrente. Questo può essere usato per calcolare i tempi trascorsi
$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
-2
nel caso in cui si abbia un lavoro in esecuzione più lungo (pensare a uno script per controllare i backup) e inviare un messaggio di posta elettronica alla fine "Il backup è iniziato da $ qualche volta completato a $ ora" - che può essere realizzato -2
evitando di archiviare un variabile dedicata all'inizio.
Dalla versione bash
5.0 ( rilasciata il 7 gennaio 2019 ) è possibile utilizzare la variabile integrata EPOCHSECONDS
.
$ echo $EPOCHSECONDS
1547624774
C'è anche EPOCHREALTIME
che include frazioni di secondi.
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
può essere convertito in micro-secondi (μs) rimuovendo il punto decimale. Questo potrebbe essere interessante quando si usa bash
l'aritmetica integrata (( expression ))
che può gestire solo numeri interi.
$ echo ${EPOCHREALTIME/./}
1547624774371215
In tutti gli esempi dall'alto i valori del tempo stampato sono uguali per una migliore leggibilità. In realtà i valori del tempo differirebbero poiché ogni comando impiega una piccola quantità di tempo per essere eseguito.
date +%s%3N
) puoi usareecho $(( ${EPOCHREALTIME/./} / 1000 ))
Con la maggior parte delle implementazioni Awk:
awk 'BEGIN {srand(); print srand()}'
srand()
siano in genere seminate con la data / ora corrente. La seconda chiamata a srand()
restituisce il valore precedentemente utilizzato come seed.
Questa è un'estensione di ciò che ha fatto @pellucide, ma per Mac:
Per determinare il numero di secondi dall'epoca (1 gennaio 1970) per una determinata data (ad es. 21 ottobre 1973)
$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800
Si noti che per completezza ho aggiunto la parte temporale al formato. Il motivo è che date
prenderà qualsiasi parte della data che hai dato e aggiungerà l' ora corrente al valore fornito. Ad esempio, se si esegue il comando sopra alle 16:19, senza la parte '00: 00: 00 ', si aggiungerà automaticamente l'ora. Tale che "21 ottobre 1973" verrà analizzato come "21 ottobre 1973 16:19:00". Potrebbe non essere quello che vuoi.
Per riconvertire il timestamp in una data:
$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973
Pagina man di Apple per l'implementazione della data: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
date
comando di BSD , mentre tutte le soluzioni che suggeriscono date -d
sono per GNU date
. La data di BSD in macOS proviene da FreeBSD e condivide una serie di opzioni con NetBSD e OpenBSD. E questo è completamente separato da bash.
%N
opzione menzionata per i secondi frazionari nella data di gnu manca dalla data di MacOS. Su 10.14, nessuno dei formati è nella pagina man; sono nella strftime(3)
pagina man, che non avrai se non hai Xcode installato, e potresti non vederlo con il comando man anche se lo fai.