Befehl zum Abrufen der Zeit in Millisekunden

286

Gibt es unter Linux einen Shell-Befehl, um die Zeit in Millisekunden abzurufen?

MOHAMED
quelle
12
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.

Alper
quelle
69
funktioniert nicht unter Mac OS, da %Nes nicht unterstützt wird vondate
yegor256
33
Frage fragt nach Linux-Befehl. Die Antwort von @ alper funktioniert gut für Datumsbefehle mit GNU-Coreutils . GNUtize your OSX: Installieren und Verwenden Sie GNU Command Line Tools unter Mac OS X
Caligari
77
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.

Michael Defort
quelle
32
%xN: schön für die Feldbreite!
fduff
1
Datum + "% Y% m% d.% H% M% S% 3N" für Millisekunden.
Nitin Mahesh
4
Ich denke, dies ist eine bessere Antwort als die, die als die richtige markiert ist.
Kcondezo
74

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? .

fedorqui 'SO hör auf zu schaden'
quelle
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:

alias date='gdate'

Dann ausführen

$ date +%s%N
Joshua Cook
quelle
10

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.

Bastian Bittorf
quelle
1
Nur eine, die bisher auf der Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS funktioniert hat - würde gerne dreimal upvoten!
Cadoiz
8

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))"'
Thamme Gowda
quelle
2
... 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:

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 adjtimexund awkverfü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 adjtimexes 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

pghalliday
quelle
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;
Lorinczy Zsigmond
quelle
1

Ein Python-Skript wie dieses:

import time
cur_time = int(time.time()*1000)
Maoyang
quelle
3
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:

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'
Chet
quelle
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:

$ 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 -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().

Quelle: GNU awk Handbuch

Auf Linux-Systemen gibt die Standard-C-Funktion getimeofday()die Zeit in Mikrosekundengenauigkeit zurück.

kvantour
quelle
0

Datum mit Uhrzeit und Zeitzone anzeigen

Datum +% d-% m-% Y% T.% N% Z

Ausgabe: 22-04-2020 18: 01: 35.970289239 IST

Anil Agrawal
quelle