Antworten:
date +%s
Gibt die Anzahl der Sekunden seit der Epoche zurück.
date +%s%N
Gibt die Sekunden und die aktuellen Nanosekunden zurück.
date +%s%N | cut -b1-13
gibt die Anzahl der Millisekunden seit der letzten Sekunde plus die drei linken Nanosekunden an.
und von MikeyB - echo $(($(date +%s%N)/1000000))
(Division durch 1000 bringt nur Mikrosekunden)
echo $(($(date +%s%N)/1000))
Sie können einfach verwenden, %3N
um die Nanosekunden auf die drei höchstwertigen Stellen (die dann Millisekunden sind) zu kürzen:
$ date +%s%3N
1397392146866
Das funktioniert zB auf meinem Kubuntu 12.04.
Beachten Sie jedoch, dass %N
dies je nach Zielsystem möglicherweise nicht implementiert ist. ZB getestet auf einem eingebetteten System (buildroot rootfs, kompiliert mit einer nicht-HF Arm Cross Toolchain) gab es keine %N
:
$ date +%s%3N
1397392146%3N
(Und auch mein (nicht verwurzeltes) Android-Tablet hat keine %N
).
1397392146%3N
zu 1397392146%N
, aber der Ausgang 1397392146%3N
ist das , was ich würde auf der Busybox - Konsole meines Android - Tablet wirklich gesehen. Könntest du deine Bearbeitung erklären?
date +%s.%3N
druckt 1510718281.134
.
date +%N
funktioniert nicht unter OS X, aber Sie könnten eines von verwenden
ruby -e 'puts Time.now.to_f'
python -c 'import time; print time.time()'
node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
date +%s000
node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
date +%s000
coreutils
Für die Leute, die vorschlagen, externe Programme auszuführen , um die Millisekunden zu erhalten ... in diesem Tempo können Sie auch Folgendes tun:
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
Beachten Sie, dass nicht alle Programme unter einer Sekunde ausgeführt werden, bevor Sie hier eine Antwort eingeben. Messen!
date
dauert die Ausführung 3 ms.
Diese Lösung funktioniert unter MacOS.
Wenn Sie ein Bash-Skript verwenden und Python zur Verfügung haben, können Sie diesen Code verwenden:
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
Wenn Sie nach einer Möglichkeit suchen, die Ausführungsdauer Ihres Skripts anzuzeigen, erhalten Sie mit den folgenden Angaben ein (nicht ganz genaues) Ergebnis:
Geben Sie so nah wie möglich am Anfang Ihres Skripts Folgendes ein
basetime=$(date +%s%N)
Dies gibt Ihnen einen Startwert von 1361802943996000000
Verwenden Sie am Ende Ihres Skripts Folgendes
echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"
das wird so etwas wie anzeigen
runtime: 12.383 seconds
Anmerkungen:
(1 * 10 ^ 09) kann auf Wunsch durch 1000000000 ersetzt werden
"scale=3"
ist eine eher seltene Einstellung, die dazu zwingt, das bc
zu tun, was Sie wollen. Es gibt noch viel mehr!
Ich habe dies nur unter Win7 / MinGW getestet ... Ich habe keine richtige * nix-Box zur Hand.
time <script>
So erhalten Sie Zeit in Millisekunden, ohne eine Division durchzuführen. Vielleicht ist es schneller ...
# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715
Update: Eine weitere Alternative in Pure Bash, die nur funktioniert, bash 4.2+
ist die gleiche wie oben, wird jedoch verwendet printf
, um das Datum abzurufen. Es wird auf jeden Fall schneller sein, da keine Prozesse von dem Hauptprozess abgezweigt werden.
printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}
Ein weiterer Haken dabei ist, dass Ihre strftime
Implementierung dies unterstützen sollte %s
und %N
was auf meinem Testcomputer NICHT der Fall ist. Siehe man strftime
unterstützte Optionen. Siehe auch man bash
sehen printf
Syntax. -1
und -2
sind spezielle Werte für die Zeit.
strftime(3)
keine Unterstützung %N
für printf
das Drucken von Nanosekunden bietet . Ich benutze Ubuntu 14.04.
date
scheint wie die zuverlässigere Option.
Der genaueste Zeitstempel, den wir bekommen können (zumindest für Mac OS X), ist wahrscheinlich der folgende:
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
1490665305.021699
Wir müssen jedoch berücksichtigen, dass die Ausführung etwa 30 Millisekunden dauert. Wir können es auf die Skala eines 2-stelligen Bruchteils zuschneiden und ganz zu Beginn den durchschnittlichen Aufwand für das Ablesen der Zeit berechnen und es dann von der Messung entfernen. Hier ist ein Beispiel:
function getTimestamp {
echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13`
}
function getDiff {
echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do
#echo -n $i
a=`getTimestamp`
#echo -n " $a"
b=`echo "$a-$prev_a" | bc`
prev_a=$a
#echo " diff=$b"
acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"
Sie können die Echobefehle auskommentieren, um besser zu sehen, wie es funktioniert.
Die Ergebnisse für dieses Skript sind normalerweise eines der folgenden 3 Ergebnisse:
measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01
Mit date und expr können Sie dorthin gelangen, z
X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X
Erweitern Sie es einfach, um zu tun, was Sie wollen
Mir ist klar, dass dies seit der Epoche keine Millisekunden mehr sind, aber in einigen Fällen kann es dennoch nützlich sein, es hängt davon ab, wofür Sie es wirklich benötigen. Multiplizieren Sie es mit 1000, wenn Sie eine Millisekunden-Zahl benötigen: D
Am einfachsten wäre es, eine kleine ausführbare Datei (aus C f.ex.) zu erstellen und sie dem Skript zur Verfügung zu stellen.
date
mehrmals auf. In einigen Fällen können sich Datum und Uhrzeit zwischen den Ausführungen ändern, während Ihr Befehl geschrieben wird. Es ist besser, date
einmal zu starten, die Teile zu analysieren und Ihre Berechnung durchzuführen. Eine von mehreren Möglichkeiten, dies zu tun, wäre t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x"
. Hierbei wird die Bash-Syntax verwendet, da die Frage mit bash gekennzeichnet ist . Wie Sie anspielen, gibt Ihre Antwort (und meine Variante) bisher nur Sekunden für den aktuellen Tag und nicht seit der Epoche und nicht in Millis.
(von oben wiederholen) date +%N
funktioniert nicht unter OS X, aber Sie könnten auch Folgendes verwenden:
Perl (erfordert das Time :: Format-Modul). Möglicherweise nicht das beste zu verwendende CPAN-Modul, erledigt aber die Aufgabe. Time :: Format wird in der Regel mit Distributionen zur Verfügung gestellt.
perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
date
kann nicht verwendet werden , und es gibt keine bash-nur Befehle , die die Notwendigkeit beantworten.
date
nicht als Teil Ihrer Antwort verwendet werden kann , würde ich meine Ablehnung entfernen.
Alle vorherigen Antworten in OSX zusammenfassen
ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G31+
Sie können gerne tun
microtime() {
python -c 'import time; print time.time()'
}
compute() {
local START=$(microtime)
#$1 is command $2 are args
local END=$(microtime)
DIFF=$(echo "$END - $START" | bc)
echo "$1\t$2\t$DIFF"
}
Wenn Sie eine einfache Berechnung der abgelaufenen Shell wünschen, ist dies einfach und portierbar. Verwenden Sie dazu die obige Antwort:
now() {
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
}
seismo:~$ x=`now`
seismo:~$ y=`now`
seismo:~$ echo "$y - $x" | bc
5.212514
Für alpines Linux (viele Docker-Images) und möglicherweise andere minimale Linux-Umgebungen können Sie Folgendes missbrauchen adjtimex
:
adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3
adjtimex
wird zum Lesen (und Setzen) von Kernel-Zeitvariablen verwendet. Mit awk
können Sie die Mikrosekunden erhalten, mit können head
Sie nur die ersten 3 Stellen verwenden.
Ich habe keine Ahnung, wie zuverlässig dieser Befehl ist.
Hinweis: Schamlos aus dieser Antwort gestohlen