Ottieni l'ora corrente in secondi dall'epoca su Linux, Bash


634

Ho bisogno di qualcosa di semplice date, ma in pochi secondi dal 1970 invece della data, ore, minuti e secondi attuali.

datenon sembra offrire questa opzione. C'è un modo semplice?


22
Scusa, devo dire questo ... '' La data non sembra offrire questa opzione. C'è un modo semplice? '' - leggi di nuovo il manuale ;-)
TheBonsai

7
Alcune versioni di data ce l'hanno e altre no. Quindi non è sempre presente. Ho eseguito 'type -a date' e ho usato una versione diversa e ha funzionato.
Scott Rowley,

1
FWIW, Ubuntu ha solo / bin / date, per cui funziona la risposta di @ Steef
Jonathan Hartley,

1
@TheBonsai che non fa parte della versione standard POSIX dello strumento 'data'. Solo perché la tua versione ce l'ha (probabilmente GNU), non dovresti presumere che lo facciano le implementazioni di tutti.
Wyatt8740,

Risposte:


1160

Questo dovrebbe funzionare:

date +%s

45
la data manpge dovrebbe essere cambiata da %s seconds since 1970-01-01 00:00:00 UTCa %s seconds since the epoch, 1970-01-01 00:00:00 UTCperché l'ho persa lì dentro.
Devin,

3
Non funziona per me. man date non mostra% s. Devo avere una versione molto vecchia di bash (3.2.51 (1) per Solaris)?
livefree75,

7
@ livefree75 datenon è integrato bash, quindi la tua versione bashnon ha nulla a che fare con l' dateimplementazione fornita dal tuo sistema.
Adrian Frühwirth,

11
E se vuoi le frazioni di secondo, con nove decimali, usa:date +%s.%N
Jonathan Hartley,

19
Per millisecondi usaredate +%s%3N
Juan Campa il

133

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


Questa non è la domanda del PO, ma risponde alla mia, quindi +1 da parte mia.
AnthonyD973,

Forse è la versione di dateo perché sto usando zsh(macOS Catalina) ma questo non funziona per me. $ date -d "Oct 21 1973" +%sUscite in esecuzioneusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter

43

Finora, tutte le risposte usano il programma esterno date.

A partire da Bash 4.2, printfha un nuovo modificatore %(dateformat)Tche, se usato con argomento, -1genera la data corrente con il formato dato da dateformat, gestito da strftime(3)( man 3 strftimeper 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 -2come 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

9
Si desidera utilizzare -2nel 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 -2evitando di archiviare un variabile dedicata all'inizio.
Sebastian J.

24

Pura soluzione di bash

Dalla versione bash5.0 ( rilasciata il 7 gennaio 2019 ) è possibile utilizzare la variabile integrata EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

C'è anche EPOCHREALTIMEche include frazioni di secondi.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEpuò essere convertito in micro-secondi (μs) rimuovendo il punto decimale. Questo potrebbe essere interessante quando si usa bashl'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.


Per una risoluzione di millisecondi (stesso formato date +%s%3N) puoi usareecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212,

23

Con la maggior parte delle implementazioni Awk:

awk 'BEGIN {srand(); print srand()}'

21
Caspita che è oscuro
ericslaw il

8
Wow, ho dovuto andare a cercare questo. Questa è una soluzione pragmatica, ma non necessariamente buona / portatile. Sembra che le implementazioni di awksrand() siano in genere seminate con la data / ora corrente. La seconda chiamata a srand()restituisce il valore precedentemente utilizzato come seed.
Ryan Ransford,

19

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 dateprenderà 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


1
Per essere chiari, questo è per il datecomando di BSD , mentre tutte le soluzioni che suggeriscono date -dsono 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.
ghoti,

l' %Nopzione 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.
Dan Pritts

1

usa questo script bash (mio ~/bin/epoch):

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
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.