Ich brauche etwas Einfaches wie date
, aber in Sekunden seit 1970 anstelle des aktuellen Datums, Stunden, Minuten und Sekunden.
date
scheint diese Option nicht anzubieten. Gibt es einen einfachen Weg?
Ich brauche etwas Einfaches wie date
, aber in Sekunden seit 1970 anstelle des aktuellen Datums, Stunden, Minuten und Sekunden.
date
scheint diese Option nicht anzubieten. Gibt es einen einfachen Weg?
Antworten:
Das sollte funktionieren:
date +%s
%s seconds since 1970-01-01 00:00:00 UTC
, %s seconds since the epoch, 1970-01-01 00:00:00 UTC
da ich es dort verpasst habe.
date
ist nicht integriert bash
, daher hat Ihre Version von bash
nichts damit zu tun, mit welcher date
Implementierung Ihr System geliefert wird.
date +%s.%N
date +%s%3N
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 date
ist 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
date
oder weil ich zsh
(macOS Catalina) benutze, aber das funktioniert bei mir nicht. Laufende $ date -d "Oct 21 1973" +%s
Ausgängeusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Bisher verwenden alle Antworten das externe Programm date
.
Seit Bash 4.2 printf
gibt es einen neuen Modifikator %(dateformat)T
, der bei Verwendung mit Argument -1
das aktuelle Datum mit dem von ausgegebenen Format ausgibt, das von dateformat
behandelt wird strftime(3)
( man 3 strftime
fü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, -1
trotzdem immer das Argument zu geben ).
Wenn Sie -2
stattdessen 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
-2
falls 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 -2
Vermeiden des Speicherns von a erreicht werden kann dedizierte Variable am Anfang.
Mit den meisten Awk-Implementierungen:
awk 'BEGIN {srand(); print srand()}'
srand()
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.
Seit bash
5.0 ( veröffentlicht am 7. Januar 2019 ) können Sie die eingebaute Variable verwenden EPOCHSECONDS
.
$ echo $EPOCHSECONDS
1547624774
Es gibt auch EPOCHREALTIME
welche Sekundenbruchteile enthält.
$ echo $EPOCHREALTIME
1547624774.371215
EPOCHREALTIME
kann durch Entfernen des Dezimalpunkts in Mikrosekunden (μs) umgerechnet werden. Dies kann von Interesse sein, wenn Sie die bash
integrierte 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.
date +%s%3N
) können Sieecho $(( ${EPOCHREALTIME/./} / 1000 ))
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 date
Ihnen 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
date
Befehl von BSD , während alle vorgeschlagenen Lösungen date -d
fü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.
%N
Option, 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.