Holen Sie sich die aktuelle Zeit in Sekunden seit der Epoche unter Linux, Bash

632

Ich brauche etwas Einfaches wie date, aber in Sekunden seit 1970 anstelle des aktuellen Datums, Stunden, Minuten und Sekunden.

datescheint diese Option nicht anzubieten. Gibt es einen einfachen Weg?

n-Alexander
quelle
22
Entschuldigung, ich muss das sagen ... «» Date scheint diese Option nicht zu bieten. Gibt es einen einfachen Weg? '' - Lesen Sie das Handbuch noch einmal ;-)
TheBonsai
7
Einige Datumsversionen haben es und andere nicht. Es ist also nicht immer vorhanden. Ich habe 'type -a date' ausgeführt und eine andere Version verwendet, und das hat funktioniert.
Scott Rowley
1
FWIW, Ubuntu hat nur / bin / date, für die @ Steefs Antwort funktioniert
Jonathan Hartley
1
@TheBonsai, das nicht Teil der POSIX-Standardversion des Datums-Tools ist. Nur weil Ihre Version es hat (wahrscheinlich GNU), sollten Sie nicht davon ausgehen, dass alle Implementierungen dies tun.
Wyatt8740

Antworten:

1158

Das sollte funktionieren:

date +%s
Steef
quelle
45
Das Datumsmanpge sollte von auf geändert werden %s seconds since 1970-01-01 00:00:00 UTC, %s seconds since the epoch, 1970-01-01 00:00:00 UTCda ich es dort verpasst habe.
Devin
3
Funktioniert bei mir nicht Mann Datum zeigt nicht% s. Ich muss eine sehr alte Version von Bash haben (3.2.51 (1) für Solaris)?
livefree75
7
@ livefree75 dateist nicht integriert bash, daher hat Ihre Version von bashnichts damit zu tun, mit welcher dateImplementierung Ihr System geliefert wird.
Adrian Frühwirth
11
Und wenn Sie die Bruchteile einer Sekunde auf neun Dezimalstellen setzen möchten, verwenden Sie:date +%s.%N
Jonathan Hartley
19
Für Millisekunden verwendendate +%s%3N
Juan Campa
133

Nur um hinzuzufügen.

Holen Sie sich die Sekunden seit der Epoche (1. Januar 1970) für ein bestimmtes Datum (z. B. 21. Oktober 1973).

date -d "Oct 21 1973" +%s


Konvertieren Sie die Anzahl der Sekunden zurück auf das Datum

date --date @120024000


Der Befehl dateist ziemlich vielseitig. Eine weitere coole Sache, die man mit Date machen kann (schamlos kopiert von date --help). Zeigen Sie die Ortszeit für 9 Uhr am kommenden Freitag an der Westküste der USA

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

Nehmen Sie sich noch etwas Zeit, um die Manpage http://man7.org/linux/man-pages/man1/date.1.html zu lesen

Pellucid
quelle
Dies ist nicht die Frage des OP, aber sie beantwortet meine, also +1 von mir.
AnthonyD973
Vielleicht ist es die Version von dateoder weil ich zsh(macOS Catalina) benutze, aber das funktioniert bei mir nicht. Laufende $ date -d "Oct 21 1973" +%sAusgängeusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter
42

Bisher verwenden alle Antworten das externe Programm date.

Seit Bash 4.2 printfgibt es einen neuen Modifikator %(dateformat)T, der bei Verwendung mit Argument -1das aktuelle Datum mit dem von ausgegebenen Format ausgibt, das von dateformatbehandelt wird strftime(3)( man 3 strftimefür Informationen zu den Formaten).

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

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

oder wenn Sie das Ergebnis in einer Variablen speichern müssen var:

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

Keine externen Programme und keine Subshells!

Seit Bash 4.3 ist es sogar möglich, Folgendes nicht anzugeben -1:

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

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

Wenn Sie -2stattdessen als Argument verwenden -1, verwendet Bash anstelle des aktuellen Datums die Zeit, zu der die Shell gestartet wurde. Dies kann verwendet werden, um verstrichene Zeiten zu berechnen

$ 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
gniourf_gniourf
quelle
9
Sie möchten verwenden, -2falls Sie einen länger laufenden Job haben (denken Sie an ein Skript zur Steuerung Ihrer Sicherungen) und am Ende eine E-Mail senden: "Die Sicherung wurde bei $ begonnen, wenn sie bei $ jetzt abgeschlossen ist" - was durch -2Vermeiden des Speicherns von a erreicht werden kann dedizierte Variable am Anfang.
Sebastian J.
23

Mit den meisten Awk-Implementierungen:

awk 'BEGIN {srand(); print srand()}'
Steven Penny
quelle
21
Wow das ist dunkel
ericslaw
8
Wow, musste diesen nachschlagen. Dies ist eine pragmatische Lösung, aber nicht unbedingt gut / tragbar. Es scheint, dass Implementierungen von awksrand() normalerweise mit dem aktuellen Datum / der aktuellen Uhrzeit versehen sind. Der zweite Aufruf von srand()gibt den Wert zurück, der zuvor als Startwert verwendet wurde.
Ryan Ransford
22

Reine Bash-Lösung

Seit bash5.0 ( veröffentlicht am 7. Januar 2019 ) können Sie die eingebaute Variable verwenden EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

Es gibt auch EPOCHREALTIMEwelche Sekundenbruchteile enthält.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEkann durch Entfernen des Dezimalpunkts in Mikrosekunden (μs) umgerechnet werden. Dies kann von Interesse sein, wenn Sie die bashintegrierte Arithmetik verwenden, (( expression ))die nur Ganzzahlen verarbeiten kann.

$ echo ${EPOCHREALTIME/./}
1547624774371215

In allen Beispielen von oben sind die gedruckten Zeitwerte zur besseren Lesbarkeit gleich. In der Realität würden sich die Zeitwerte unterscheiden, da die Ausführung jedes Befehls nur wenig Zeit in Anspruch nimmt.

Socowi
quelle
Für die Millisekundenauflösung (gleiches Format wie date +%s%3N) können Sieecho $(( ${EPOCHREALTIME/./} / 1000 ))
Luckman212
19

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

Ermittlung der Anzahl der Sekunden seit der Epoche (1. Januar 1970) für ein bestimmtes Datum (z. B. 21. Oktober 1973)

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

Bitte beachten Sie, dass ich der Vollständigkeit halber den Zeitteil zum Format hinzugefügt habe. Der Grund dafür ist, dass der von dateIhnen angegebene Datumsteil verwendet wird und die aktuelle Zeit zum angegebenen Wert hinzugefügt wird. 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 "21. Oktober 1973" als "21. Oktober 1973 16:19:00" analysiert wird. Das ist vielleicht nicht das, was Sie wollen.

So konvertieren Sie Ihren Zeitstempel zurück in ein Datum:

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

Apples Manpage zur Datumsimplementierung: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

PeqNP
quelle
1
Um klar zu sein, ist dies für den dateBefehl von BSD , während alle vorgeschlagenen Lösungen date -dfür GNU sind date. Das BSD-Datum in macOS stammt von FreeBSD und teilt eine Reihe von Optionen mit NetBSD und OpenBSD. Und das ist völlig unabhängig von Bash.
Ghoti
Die %NOption, die für Sekundenbruchteile im Gnu-Datum angegeben ist, fehlt im MacOS-Datum. Am 10.14 befindet sich keines der Formate in der Manpage. Sie befinden sich in der strftime(3)Manpage, die Sie nicht haben, wenn Sie Xcode nicht installiert haben, und möglicherweise nicht mit dem Befehl man sehen, selbst wenn Sie dies tun.
Dan Pritts
1

Verwenden Sie dieses Bash-Skript (my ~/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" "$@"
Comonad
quelle