wake-up-neo.com

Befehl, um Zeit in Millisekunden zu erhalten

Gibt es in Linux einen Shell-Befehl, um die Zeit in Millisekunden zu ermitteln?

212
MOHAMED

date +%s%N gibt die Anzahl der Sekunden + aktuellen Nanosekunden zurück.

Deshalb brauchen Sie echo $(($(date +%s%N)/1000000)).

ex:

$ echo $(($(date +%s%N)/1000000))
1535546718115

date +%s gibt die Anzahl der Sekunden seit der Epoche zurück, falls dies nützlich ist

279
Alper
  • date +"%T.%N" gibt die aktuelle Uhrzeit mit Nanosekunden zurück. 

    06:46:41.431857000
    
  • date +"%T.%6N" gibt die aktuelle Uhrzeit mit Nanosekunden zurück, die auf die ersten 6 Ziffern (Mikrosekunden) gerundet sind.

    06:47:07.183172
    
  • date +"%T.%3N" gibt die aktuelle Zeit mit Nanosekunden zurück, die auf die ersten 3 Ziffern gerundet sind, also Millisekunden.

    06:47:42.773
    

Im Allgemeinen kann jedem Feld des Befehls date eine optionale Feldbreite zugewiesen werden.

258
Michael Defort

nano ist 10−9 und milli 10−3. Daher können wir die 3 ersten Zeichen von Nanosekunden verwenden, um die Milli 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 mit Bash die aktuelle Unix-Zeit in Millisekunden? .

59
fedorqui

Unter OS X, wo date das %N-Flag nicht unterstützt, empfehle ich, coreutils mit homebrew zu installieren. Dadurch erhalten Sie Zugriff auf einen Befehl mit dem Namen gdate, der sich auf Linux-Systemen wie date verhält. 

brew install coreutils

Für eine "native" Erfahrung können Sie dies immer zu Ihrem .bash_aliases hinzufügen.

alias date='gdate'

dann ausführen

$ date +%s%N
37
Joshua Cook

Der Befehl date lieferte keine Millisekunden unter OS X, daher wurde ein Alias ​​aus Python verwendet

millis(){  python -c "import time; print(int(time.time()*1000))"; }

OR

alias millis='python -c "import time; print(int(time.time()*1000))"'
6
Thamme Gowda

Die anderen Antworten sind wahrscheinlich in den meisten Fällen ausreichend, aber ich dachte, ich würde meine 2 Cents hinzufügen, da ich auf einem System mit einer ausgelasteten Box auf ein Problem stieß.

Das betreffende System unterstützte die Formatoption %N nicht und hat keinen python- oder Perl-Interpreter.

Nach vielem Kopfkratzen haben wir uns (danke Dave!) Folgendes ausgedacht:

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

Es extrahiert die Sekunden und Mikrosekunden aus der Ausgabe von adjtimex (normalerweise verwendet, um Optionen für die Systemuhr einzustellen) und druckt sie ohne neue Zeilen (damit sie zusammengeklebt werden). Beachten Sie, dass das Mikrosekunden-Feld mit Nullen aufgefüllt werden muss. Dies wirkt sich jedoch nicht auf das Sekunden-Feld aus, das ohnehin länger als 6 Stellen ist. Es sollte daher trivial sein, Mikrosekunden in Millisekunden umzuwandeln.

Wenn Sie eine neue Zeile benötigen (vielleicht, weil sie besser aussieht), dann versuchen Sie es

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"

Beachten Sie auch, dass hierfür adjtimex und awk verfügbar sein müssen. Wenn nicht, dann können Sie mit busybox lokal auf sie zeigen

ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk

Und dann rufe das oben als an

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

Oder Sie könnten sie natürlich in Ihre PATH setzen

BEARBEITEN:

Das oben genannte funktionierte auf meinem Gerät "busybox". Auf Ubuntu habe ich dasselbe ausprobiert und festgestellt, dass adjtimex verschiedene Versionen hat. Auf Ubuntu funktionierte dies, um die Zeit in Sekunden mit Dezimalstellen in Mikrosekunden auszugeben (einschließlich einer neuen Zeile).

Sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'

Ich würde das allerdings nicht auf Ubuntu machen. Ich würde date +%s%N verwenden

4
pghalliday

hier ist ein irgendwie tragbarer 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 Procfs arbeitet

2
Bastian Bittorf

Ich wollte der Antwort von @ Alper nur hinzufügen, was ich tun musste, um dieses Zeug zum Laufen zu bringen:

Auf einem Mac benötigen Sie brew install coreutils, damit wir gdate verwenden können. Ansonsten ist es unter Linux nur date. Und diese Funktion hilft Ihnen, Befehle zu erledigen, 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 einem String verwenden timeit 'tsc --noEmit'

0
Chet

Perl kann dafür verwendet werden, auch auf exotischen Plattformen wie AIX. 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;
0

python-Skript wie folgt:

import time
cur_time = int(time.time()*1000)
0
maoyang