2009-07-07 19 views
396

Ich brauche etwas einfaches wie date, aber in Sekunden seit 1970 anstelle des aktuellen Datums, Stunden, Minuten und Sekunden.Aktuelle Zeit in Sekunden seit der Epoche unter Linux, Bash

date scheint nicht diese Option zu bieten. Gibt es einen einfachen Weg?

+18

Sorry, ich muss sagen .... '' Date scheint nicht Angebot diese Option. Gibt es einen einfachen Weg? "" - Lesen Sie das Handbuch noch einmal ;-) – TheBonsai

+5

Einige Versionen des Datums haben es und andere nicht. Es ist also nicht immer präsent. Ich lief 'Typ -ein Datum' und benutzte eine andere Version und das funktionierte. –

+0

FWIW, Ubuntu hat nur/bin/date, für das @ Steefs Antwort funktioniert –

Antwort

747

sollte diese Arbeit:

date +%s 
+27

Das Datum manpge sollte von '% s Sekunden seit 1970-01-01 00:00:00 UTC' auf '% s Sekunden seit der Epoche geändert werden , 1970-01-01 00:00:00 UTC, weil ich es dort verpasst habe. – devin

+3

Funktioniert nicht für mich. man date zeigt% s nicht an. Ich muss eine sehr alte Version von Bash (3.2.51 (1) für Solaris) haben? – livefree75

+3

@ livefree75 'date' ist nicht in' bash' integriert, so dass Ihre Version von 'bash' nichts damit zu tun hat, mit welcher 'datum'-Implementierung Ihr System ausgeliefert wird. –

91

einfach hinzuzufügen. Wenn Sie die Sekunden seit der Epoche (1. Januar 1970) für ein bestimmtes Datum (z. B. 21. Oktober 1973) erhalten möchten.

date -d "Oct 21 1973" +%s 


konvertieren die Anzahl der Sekunden zurück

bisher
date --date @120024000 


Der Befehl date ziemlich vielseitig ist. Eine andere coole Sache, die Sie mit Datum (schamlos kopiert von date --help) tun können. zeigt die lokale Zeit für 09.00 Uhr am nächsten Freitag an der Westküste der USA

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

Noch besser wäre es, einige Zeit dauern, die man-Seite http://www.manpages.info/linux/date.1.html

14

Dies ist eine Erweiterung zu lesen, was @pellucide getan hat , aber für Macs:

Um die Anzahl der Sekunden seit Epoche (1. Januar 1970) für einen bestimmten Zeitpunkt (21 1973 zB Okt) zu bestimmen

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

Bitte beachten Sie, dass ich zur Vollständigkeit den Zeitteil zum Format hinzugefügt habe. Der Grund dafür ist, dass date das von Ihnen angegebene Datumsteil übernehmen und die aktuelle Zeit dem angegebenen Wert hinzufügen. Wenn Sie beispielsweise den obigen Befehl um 16:19 Uhr ohne den Teil "00: 00: 00" ausführen, wird die Zeit automatisch hinzugefügt. So dass "Oct 21 1973" als "Oct 21 1973 16:19:00" geparst wird. Das ist vielleicht nicht das, was du willst.

Um die Zeitstempel in ein Datum umwandeln zurück:

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

Apples Mann-Seite für die Umsetzung Datum: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

23

Bisher alle Antworten verwenden das externe Programm date.

Da heftiger Schlag 4.2, printf hat einen neuen Modifier %(dateformat)T die, wenn sie mit dem Argument verwendet -1 gibt das aktuelle Datum mit dem Format von dateformat gegeben, gehandhabt durch strftime(3) (man 3 strftime für Informationen über die Formate).

Also, für eine reine Bash Lösung:

printf '%(%s)T\n' -1 

oder wenn Sie das Ergebnis in einer Variablen var speichern:

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

Keine externen Programme und keine Subshells!

Seit Bash 4.3, es ist sogar möglich, nicht die -1 angeben:

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

(aber es könnte klüger sein, immer das Argument zu geben -1 dennoch).

Wenn Sie -2 als Argument anstelle von -1 verwenden, verwendet Bash die Uhrzeit, an der die Shell gestartet wurde, anstelle des aktuellen Datums (aber warum sollten Sie das wollen?).

+4

Sie wollen' -2' verwenden, wenn Sie einen längeren Job haben (denken Sie an ein Skript an steuere deine Backups) und sende am Ende eine Mail "Backup gestartet bei $ somewhen bei $ now abgeschlossen" - was mit '-2' bewerkstelligt werden kann und es vermeidet, eine dedizierte Variable am Anfang zu speichern. –

1

Verwendung dieses Bash-Skript (mein ~/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

Bei den meisten awk-Implementierungen:

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

Wow, das ist obskur – ericslaw

+1

Wow, musste diesen Blick nach oben gehen. Dies ist eine pragmatische Lösung, aber nicht unbedingt gut/portabel. [Es scheint, dass Implementierungen von awk 'srand()'] (https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html) typischerweise mit dem aktuellen Datum/der aktuellen Zeit versehen sind. Der zweite Aufruf von 'srand()' gibt den Wert zurück, der zuvor als Seed verwendet wurde. –

Verwandte Themen