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.
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'
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
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.
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.
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.
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:
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""$@"
Antworten:
Das sollte funktionieren:
quelle
%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 integriertbash
, daher hat Ihre Version vonbash
nichts damit zu tun, mit welcherdate
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).
Konvertieren Sie die Anzahl der Sekunden zurück auf das Datum
Der Befehl
date
ist ziemlich vielseitig. Eine weitere coole Sache, die man mit Date machen kann (schamlos kopiert vondate --help
). Zeigen Sie die Ortszeit für 9 Uhr am kommenden Freitag an der Westküste der USANehmen Sie sich noch etwas Zeit, um die Manpage http://man7.org/linux/man-pages/man1/date.1.html zu lesen
quelle
date
oder weil ichzsh
(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 vondateformat
behandelt wirdstrftime(3)
(man 3 strftime
für Informationen zu den Formaten).Also, für eine reine Bash-Lösung:
oder wenn Sie das Ergebnis in einer Variablen speichern müssen
var
:Keine externen Programme und keine Subshells!
Seit Bash 4.3 ist es sogar möglich, Folgendes nicht anzugeben
-1
:(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 berechnenquelle
-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:
quelle
srand()
normalerweise mit dem aktuellen Datum / der aktuellen Uhrzeit versehen sind. Der zweite Aufruf vonsrand()
gibt den Wert zurück, der zuvor als Startwert verwendet wurde.Reine Bash-Lösung
Seit
bash
5.0 ( veröffentlicht am 7. Januar 2019 ) können Sie die eingebaute Variable verwendenEPOCHSECONDS
.Es gibt auch
EPOCHREALTIME
welche Sekundenbruchteile enthält.EPOCHREALTIME
kann durch Entfernen des Dezimalpunkts in Mikrosekunden (μs) umgerechnet werden. Dies kann von Interesse sein, wenn Sie diebash
integrierte Arithmetik verwenden,(( expression ))
die nur Ganzzahlen verarbeiten kann.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.
quelle
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)
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:
Apples Manpage zur Datumsimplementierung: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html
quelle
date
Befehl von BSD , während alle vorgeschlagenen Lösungendate -d
für GNU sinddate
. 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 derstrftime(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.Verwenden Sie dieses Bash-Skript (my
~/bin/epoch
):quelle