Gibt es unter Linux einen Shell-Befehl, um die Zeit in Millisekunden abzurufen?
date -Ins
Gibt es unter Linux einen Shell-Befehl, um die Zeit in Millisekunden abzurufen?
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:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
Gibt die Anzahl der Sekunden seit der Epoche zurück, falls dies nützlich ist.
%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 den gdate
Befehl verwenden. Siehe diese Frage: stackoverflow.com/questions/9804966/…
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 date
Befehlsformat eine optionale Feldbreite zugewiesen werden.
%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:
date +%s%3N
Von man date
:
% N. Nanosekunden (000000000..999999999)
% s Sekunden seit 1970-01-01 00:00:00 UTC
Quelle: Server Fault's Wie erhalte ich die aktuelle Unix-Zeit in Millisekunden in Bash? .
Unter OS X, wo date
das %N
Flag nicht unterstützt wird , empfehle ich die Installation coreutils
mit Homebrew . Auf diese Weise erhalten Sie Zugriff auf einen Befehl namens gdate
, der sich wie date
auf Linux-Systemen verhält .
brew install coreutils
Für eine "native" Erfahrung können Sie dies jederzeit zu Ihrem hinzufügen .bash_aliases
:
alias date='gdate'
Dann ausführen
$ date +%s%N
Hier ist ein irgendwie portabler Hack für Linux, um Zeit in Millisekunden zu bekommen:
#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3 # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"
millisec=$(( 10*(t2-t1) ))
echo $millisec
Die Ausgabe ist:
3010
Dies ist eine sehr billige Operation, die mit Shell-Interna und -Prozessen funktioniert.
date
Der Befehl hat unter OS X keine Millisekunden bereitgestellt, daher wurde ein Alias von Python verwendet
millis(){ python -c "import time; print(int(time.time()*1000))"; }
ODER
alias millis='python -c "import time; print(int(time.time()*1000))"'
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:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
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
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Beachten Sie auch, dass dies erfordert adjtimex
und awk
verfügbar sein muss. Wenn nicht, können Sie mit BusyBox lokal auf sie verweisen mit:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Und dann nenne das oben als
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
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.
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Ich würde das allerdings nicht unter Ubuntu machen. ich würde ... benutzendate +%s%N
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;
Ein Python-Skript wie dieses:
import time
cur_time = int(time.time()*1000)
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ö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:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
Und Sie können es mit einer Zeichenfolge verwenden:
timeit 'tsc --noEmit'
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:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
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-1
und stellen Sie sie einERRNO
. 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 verwendenGetSystemTimeAsFileTime()
.Quelle: GNU awk Handbuch
Auf Linux-Systemen gibt die Standard-C-Funktion getimeofday()
die Zeit in Mikrosekundengenauigkeit zurück.
Datum mit Uhrzeit und Zeitzone anzeigen
Datum +% d-% m-% Y% T.% N% Z
Ausgabe: 22-04-2020 18: 01: 35.970289239 IST
date +%s.%N
würde dir Nanosekunden geben, kannst du damit arbeiten?