2009-07-07 3 views
396

Ho bisogno di qualcosa di semplice come date, ma in secondi dal 1970 invece della data corrente, ore, minuti e secondi.Ottieni l'ora corrente in secondi da Epoch su Linux, Bash

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

+18

Siamo spiacenti, devo dire che questo .... '' Data non sembra offerta questa opzione. C'è un modo semplice? '' - leggi di nuovo il manuale ;-) – TheBonsai

+5

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 questo ha funzionato. –

+0

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

risposta

747

Questo dovrebbe funzionare:

date +%s 
+27

la data manpge deve essere modificata da% s secondi dal 1970-01-01 00:00:00 UTC a '% s secondi dall'epoca , 1970-01-01 00:00:00 UTC perché l'ho perso lì. – devin

+3

Non funziona per me. data uomo non mostra% s. Devo avere una versione molto vecchia di bash (3.2.51 (1) per Solaris)? – livefree75

+3

@ livefree75 'date' non è incorporato in' bash', quindi la tua versione di 'bash' non ha nulla a che fare con l'implementazione' date' del tuo sistema. –

91

solo per aggiungere. Se si desidera ottenere i secondi dall'epoca (1 gennaio 1970) per una data specifica (ad esempio, 21 ottobre 1973).

date -d "Oct 21 1973" +%s 


convertire il numero di secondi indietro fino ad oggi

date --date @120024000 


Il comando date è abbastanza versatile. Un'altra cosa interessante che puoi fare con la data (copiata senza vergogna da date --help). Mostra l'ora locale per 09:00 Venerdì prossimo, sulla costa occidentale degli Stati Uniti

date --date='TZ="America/Los_Angeles" 09:00 next Fri' 

Meglio ancora, prendere un po 'di tempo per leggere la pagina man http://www.manpages.info/linux/date.1.html

14

Si tratta di un'estensione per quello che ha fatto @pellucide , ma per Mac:

per determinare il numero di secondi dal periodo (1 gennaio 1970) per una determinata data (ad esempio ott 21 1973)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s" 
120034800 

Si prega di notare che per completezza, ho aggiunto la parte temporale al formato. Il motivo è che lo date prenderà qualsiasi parte della data che gli è stata assegnata e aggiungere l'ora allo stato al valore fornito. Ad esempio, se si esegue il comando precedente alle 16:19, senza la parte '00: 00: 00 ', si aggiungerà automaticamente l'ora. Tale che "21 ottobre 1973" sarà analizzato come "21 ottobre 1973 16:19:00". Potrebbe non essere quello che vuoi.

Per convertire il timestamp di nuovo a una data:

$ date -j -r 120034800 
Sun Oct 21 00:00:00 PDT 1973 

pagina man di Apple per l'attuazione Data: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

23

Finora, tutte le risposte utilizzano il programma esterno date.

Da Bash 4.2, printf ha un nuovo modificatore %(dateformat)T che, quando utilizzato con l'argomento -1 emette la data corrente con il formato in dateformat, gestito da strftime(3) (man 3 strftime per informazioni sui formati).

Così, 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 programmi esterni e nessun sottoshell!

Da Bash 4.3, è ancora possibile non specificare la -1:

printf -v var '%(%s)T' 

(ma potrebbe essere più saggio dare sempre l'argomento -1 comunque).

Se si utilizza -2 come argomento anziché -1, Bash utilizzerà il tempo di avvio della shell anziché la data corrente (ma perché lo si desidera?).

+4

Vuoi usare' -2' se hai un lavoro più lungo (pensa a uno script per controlla i backup) e invia una mail alla fine "Backup avviato a $ somewhen completato a $ now" - che può essere eseguito con '-2' evitando di memorizzare una variabile dedicata all'inizio. –

1

uso questo script bash (la mia ~/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" "[email protected]" 
6

Con la maggior parte delle implementazioni Awk:

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

Wow che è oscuro – ericslaw

+1

Wow, dovevo dare un'occhiata a questo. Questa è una soluzione pragmatica, ma non necessariamente buona/portatile. [Sembra che le implementazioni di awk 'srand()'] (https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html) siano tipicamente associate alla data/ora corrente. La seconda chiamata a 'srand()' restituisce il valore precedentemente usato come seme. –