date +%s.%Nwürde dir Nanosekunden geben, kannst du damit arbeiten?
Wrikken
1
@Wrikken Dies ist jedoch nicht ganz portabel.
Camilo Martin
16
Datum + "% Y% m% d.% H% M% S% 3N" - Im Allgemeinen verwende ich diesen Befehl, um das vollständige Datum und die eindeutige Zeit bis zu Millisekunden abzurufen und die temporären Dateinamen im Unix-Bash-Skript zu erstellen. Wenn Ihr System Millisekunden nicht bewältigen kann, können Sie mit 3 bis 6 bzw. 9 zu Mikro- oder Nanosekunden wechseln.
Nitin Mahesh
Versuchen Siedate -Ins
Dr. Person Person II
Antworten:
343
date +%s%N Gibt die Anzahl der Sekunden + aktuelle Nanosekunden zurück.
Deshalb echo $(($(date +%s%N)/1000000))ist was Sie brauchen.
Beispiel:
$ echo $(($(date +%s%N)/1000000))1535546718115
date +%s Gibt die Anzahl der Sekunden seit der Epoche zurück, falls dies nützlich ist.
date +%s%3Nist schneller (basierend auf der Antwort von @ michael-defort)
caligari
10
Unter OSX müssen Sie die GNU-Version von date im Rahmen der coreutilsVerwendung von MacPorts oder Homebrew installieren und dann den gdateBefehl verwenden. Siehe diese Frage: stackoverflow.com/questions/9804966/…
Pierz
1
Obwohl Datum +% s% 3N einfacher oder besser zu sein scheint, führte die Verwendung in einer anderen Offset-Berechnung dazu, dass der Zeitstempel um 1 Millisekunde reduziert wurde! Aber diese Lösung funktionierte perfekt mit Offset-Berechnung
Arsinux
341
date +"%T.%N" Gibt die aktuelle Zeit mit Nanosekunden zurück.
06:46:41.431857000
date +"%T.%6N" Gibt die aktuelle Zeit mit auf die ersten 6 Stellen gerundeten Nanosekunden zurück, was Mikrosekunden entspricht.
06:47:07.183172
date +"%T.%3N" Gibt die aktuelle Zeit mit auf die ersten 3 Stellen gerundeten Nanosekunden zurück, was Millisekunden entspricht.
06:47:42.773
Im Allgemeinen kann jedem Feld im dateBefehlsformat eine optionale Feldbreite zugewiesen werden.
Ich bin so stolz, dass @Peter Mortensen eine seiner großartigen aktiven Lesungen in einem meiner Beiträge gemacht hat :) Danke !!
Fedorqui 'SO hör auf,'
46
Unter OS X, wo datedas %NFlag nicht unterstützt wird , empfehle ich die Installation coreutilsmit Homebrew . Auf diese Weise erhalten Sie Zugriff auf einen Befehl namens gdate, der sich wie dateauf Linux-Systemen verhält .
brew install coreutils
Für eine "native" Erfahrung können Sie dies jederzeit zu Ihrem hinzufügen .bash_aliases:
... Sobald Sie jedoch fork()einen separaten Prozess beendet haben, execIhren Python-Interpreter bearbeitet haben, lassen Sie ihn seine Bibliotheken laden / anderweitig initialisieren, sein Ergebnis schreiben und beenden, wird dieses Ergebnis nicht mehr korrekt sein.
Charles Duffy
4
Die anderen Antworten sind wahrscheinlich in den meisten Fällen ausreichend, aber ich dachte, ich würde meine zwei Cent hinzufügen, da ich auf ein Problem mit einer BusyBox stieß System .
Das fragliche System unterstützte das nicht %N Formatoption nicht und hat keinen Python- oder Perl-Interpreter.
Nach langem Kopfkratzen haben wir (danke Dave!) Folgendes gefunden:
Es extrahiert die Sekunden und Mikrosekunden aus der Ausgabe von adjtimex (normalerweise zum Festlegen von Optionen für die Systemuhr) und druckt sie ohne neue Zeilen (damit sie zusammengeklebt werden). Beachten Sie, dass das Mikrosekundenfeld mit Nullen vorgefüllt werden muss. Dies wirkt sich jedoch nicht auf das Sekundenfeld aus, das ohnehin länger als sechs Stellen ist. Daher sollte es trivial sein, Mikrosekunden in Millisekunden umzuwandeln.
Wenn Sie eine nachfolgende neue Zeile benötigen (möglicherweise, weil sie besser aussieht), versuchen Sie es
Oder natürlich könnten Sie sie in Ihre setzen PATH
BEARBEITEN:
Das obige funktionierte auf meinem BusyBox-Gerät. Unter Ubuntu habe ich das Gleiche versucht und festgestellt, dass adjtimexes verschiedene Versionen gibt. Unter Ubuntu funktionierte dies, um die Zeit in Sekunden mit Dezimalstellen in Mikrosekunden (einschließlich einer nachfolgenden neuen Zeile) auszugeben.
Wow, tolle Alternative! Ihr Befehl funktioniert zwar, aber ich habe keine Ahnung warum. Wo finde ich eine Dokumentation für den Befehl awk?! Wie zum Teufel haben Sie herausgefunden, wie Sie den String erstellen, um die gewünschten Informationen aus der adjtimex-Ausgabe zu extrahieren?
Satria
Fantastische Busybox-Lösung
Codebling
1
Perl kann dafür auch auf exotischen Plattformen wie AIX eingesetzt werden. Beispiel:
#!/usr/bin/perl -w
use strict;
use Time::HiRes qw(gettimeofday);
my ($t_sec, $usec)= gettimeofday ();
my $msec= int ($usec/1000);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=
localtime ($t_sec);
printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",1900+$year,1+$mon, $mday, $hour, $min, $sec, $msec;
Dies gibt nicht die Anzahl der Millisekunden zurück, sondern die Anzahl der Sekunden in Millisekunden. Alles wird $ SECONDS000 sein
Kilianc
1
Der Python-Code von @kilianc maoyang liefert Millisekunden.
Jlliagre
@jlliagre: Aber ist die tatsächliche Zeitauflösung besser als 16-17 ms (1/60 Sekunde) oder nicht?
Peter Mortensen
Ja, Python time.time()gibt einen Gleitkommawert auf 6 Dezimalstellen zurück, zumindest unter macOS.
Porglezomp
1
Ich wollte nur zu Alpers Antwort hinzufügen, was ich tun musste, um dieses Zeug zum Laufen zu bringen:
Auf dem Mac benötigen Sie brew install coreutils, damit wir verwenden können gdate. Ansonsten ist es unter Linux einfach so date. Mit dieser Funktion können Sie Zeitbefehle zeitlich festlegen, ohne temporäre Dateien oder ähnliches erstellen zu müssen:
Ich mag diese Lösung, aber ich interessiere mich mehr für Millis. Ich habe diese Funktion auf meine .bashrc in Ubuntu portiert:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv
1
Wenn Sie GNU AWK seit Version 4.1 verwenden, können Sie die Zeitbibliothek laden und Folgendes tun:
Dadurch wird die aktuelle Zeit in Sekunden seit 1970-01-01T00: 00: 00 mit einer Genauigkeit von weniger als einer Sekunde gedruckt.
the_time = gettimeofday()
Geben Sie die seit dem 01.01.1970 UTC verstrichene Zeit in Sekunden als Gleitkommawert zurück. Wenn die Zeit auf dieser Plattform nicht verfügbar ist, kehren Sie zurück -1und stellen Sie sie ein ERRNO. Die zurückgegebene Zeit sollte eine Genauigkeit von weniger als einer Sekunde haben , die tatsächliche Genauigkeit kann jedoch je nach Plattform variieren. Wenn der Standard-C- gettimeofday()Systemaufruf auf dieser Plattform verfügbar ist, wird einfach der Wert zurückgegeben. Andernfalls versucht es unter MS-Windows zu verwenden GetSystemTimeAsFileTime().
date +%s.%N
würde dir Nanosekunden geben, kannst du damit arbeiten?date -Ins
Antworten:
date +%s%N
Gibt die Anzahl der Sekunden + aktuelle Nanosekunden zurück.Deshalb
echo $(($(date +%s%N)/1000000))
ist was Sie brauchen.Beispiel:
date +%s
Gibt die Anzahl der Sekunden seit der Epoche zurück, falls dies nützlich ist.quelle
%N
es nicht unterstützt wird vondate
date +%s%3N
ist schneller (basierend auf der Antwort von @ michael-defort)coreutils
Verwendung von MacPorts oder Homebrew installieren und dann dengdate
Befehl verwenden. Siehe diese Frage: stackoverflow.com/questions/9804966/…date +"%T.%N"
Gibt die aktuelle Zeit mit Nanosekunden zurück.date +"%T.%6N"
Gibt die aktuelle Zeit mit auf die ersten 6 Stellen gerundeten Nanosekunden zurück, was Mikrosekunden entspricht.date +"%T.%3N"
Gibt die aktuelle Zeit mit auf die ersten 3 Stellen gerundeten Nanosekunden zurück, was Millisekunden entspricht.Im Allgemeinen kann jedem Feld im
date
Befehlsformat eine optionale Feldbreite zugewiesen werden.quelle
%xN
: schön für die Feldbreite!Nano ist 10 –9 und Milli 10 –3 . Daher können wir die drei ersten Zeichen von Nanosekunden verwenden, um die Millisekunden zu erhalten:
Von
man date
:Quelle: Server Fault's Wie erhalte ich die aktuelle Unix-Zeit in Millisekunden in Bash? .
quelle
Unter OS X, wo
date
das%N
Flag nicht unterstützt wird , empfehle ich die Installationcoreutils
mit Homebrew . Auf diese Weise erhalten Sie Zugriff auf einen Befehl namensgdate
, der sich wiedate
auf Linux-Systemen verhält .Für eine "native" Erfahrung können Sie dies jederzeit zu Ihrem hinzufügen
.bash_aliases
:Dann ausführen
quelle
Hier ist ein irgendwie portabler Hack für Linux, um Zeit in Millisekunden zu bekommen:
Die Ausgabe ist:
Dies ist eine sehr billige Operation, die mit Shell-Interna und -Prozessen funktioniert.
quelle
date
Der Befehl hat unter OS X keine Millisekunden bereitgestellt, daher wurde ein Alias von Python verwendetODER
quelle
fork()
einen separaten Prozess beendet haben,exec
Ihren Python-Interpreter bearbeitet haben, lassen Sie ihn seine Bibliotheken laden / anderweitig initialisieren, sein Ergebnis schreiben und beenden, wird dieses Ergebnis nicht mehr korrekt sein.Die anderen Antworten sind wahrscheinlich in den meisten Fällen ausreichend, aber ich dachte, ich würde meine zwei Cent hinzufügen, da ich auf ein Problem mit einer BusyBox stieß System .
Das fragliche System unterstützte das nicht
%N
Formatoption nicht und hat keinen Python- oder Perl-Interpreter.Nach langem Kopfkratzen haben wir (danke Dave!) Folgendes gefunden:
Es extrahiert die Sekunden und Mikrosekunden aus der Ausgabe von
adjtimex
(normalerweise zum Festlegen von Optionen für die Systemuhr) und druckt sie ohne neue Zeilen (damit sie zusammengeklebt werden). Beachten Sie, dass das Mikrosekundenfeld mit Nullen vorgefüllt werden muss. Dies wirkt sich jedoch nicht auf das Sekundenfeld aus, das ohnehin länger als sechs Stellen ist. Daher sollte es trivial sein, Mikrosekunden in Millisekunden umzuwandeln.Wenn Sie eine nachfolgende neue Zeile benötigen (möglicherweise, weil sie besser aussieht), versuchen Sie es
Beachten Sie auch, dass dies erfordert
adjtimex
undawk
verfügbar sein muss. Wenn nicht, können Sie mit BusyBox lokal auf sie verweisen mit:Und dann nenne das oben als
Oder natürlich könnten Sie sie in Ihre setzen
PATH
BEARBEITEN:
Das obige funktionierte auf meinem BusyBox-Gerät. Unter Ubuntu habe ich das Gleiche versucht und festgestellt, dass
adjtimex
es verschiedene Versionen gibt. Unter Ubuntu funktionierte dies, um die Zeit in Sekunden mit Dezimalstellen in Mikrosekunden (einschließlich einer nachfolgenden neuen Zeile) auszugeben.Ich würde das allerdings nicht unter Ubuntu machen. ich würde ... benutzen
date +%s%N
quelle
Perl kann dafür auch auf exotischen Plattformen wie AIX eingesetzt werden. Beispiel:
quelle
Ein Python-Skript wie dieses:
quelle
time.time()
gibt einen Gleitkommawert auf 6 Dezimalstellen zurück, zumindest unter macOS.Ich wollte nur zu Alpers Antwort hinzufügen, was ich tun musste, um dieses Zeug zum Laufen zu bringen:
Auf dem Mac benötigen Sie
brew install coreutils
, damit wir verwenden könnengdate
. Ansonsten ist es unter Linux einfach sodate
. Mit dieser Funktion können Sie Zeitbefehle zeitlich festlegen, ohne temporäre Dateien oder ähnliches erstellen zu müssen:Und Sie können es mit einer Zeichenfolge verwenden:
quelle
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Wenn Sie GNU AWK seit Version 4.1 verwenden, können Sie die Zeitbibliothek laden und Folgendes tun:
Dadurch wird die aktuelle Zeit in Sekunden seit 1970-01-01T00: 00: 00 mit einer Genauigkeit von weniger als einer Sekunde gedruckt.
Auf Linux-Systemen gibt die Standard-C-Funktion
getimeofday()
die Zeit in Mikrosekundengenauigkeit zurück.quelle
Datum mit Uhrzeit und Zeitzone anzeigen
Ausgabe: 22-04-2020 18: 01: 35.970289239 IST
quelle