it-swarm.com.de

Wie erhalte ich die aktuelle Unix-Zeit in Millisekunden in Bash?

Wie erhalte ich die aktuelle Unix-Zeit in Millisekunden (d. H. Anzahl der Millisekunden seit der Unix-Epoche vom 1. Januar 1970)?

253
Richard

Diese:

date +%s 

gibt die Anzahl der Sekunden seit der Epoche zurück.

Diese:

date +%s%N

gibt die Sekunden und aktuellen Nanosekunden zurück.

Damit:

date +%s%N | cut -b1-13

gibt Ihnen die Anzahl der Millisekunden seit der Epoche - aktuelle Sekunden plus die linken drei Nanosekunden.


und von MikeyB - echo $(($(date +%s%N)/1000000)) (dividiert durch 1000 bringt nur Mikrosekunden)

283
warren

Sie können einfach %3N Verwenden, um die Nanosekunden auf die drei wichtigsten Stellen (die dann Millisekunden sind) zu kürzen:

$ date +%s%3N
1397392146866

Dies funktioniert z.B. auf meinem Kubunt 12.04 (Precise Pangolin).

Beachten Sie jedoch, dass %N Abhängig von Ihrem Zielsystem möglicherweise nicht implementiert wird. Z.B. Auf einem eingebetteten System getestet (Buildroot-Rootfs, kompiliert mit einer Nicht-HF ARM Cross-Toolchain) gab es kein %N:

$ date +%s%3N
1397392146%3N

(Und auch mein (nicht verwurzeltes) Android Tablet hat kein %N.)

111
Joe

date +%N Funktioniert unter OS X nicht, aber Sie können eines davon verwenden

  • Ruby : Ruby -e 'puts Time.now.to_f'
  • Python : python -c 'import time; print time.time()'
  • Node.js : node -e 'console.log(Date.now())'
  • PHP : php -r 'echo microtime(TRUE);'
  • Elixier : DateTime.utc_now() |> DateTime.to_unix(:millisecond)
  • Das Internet: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • oder für Millisekunden auf die nächste Sekunde gerundet date +%s000
67
Lri

Meine Lösung ist nicht die beste, aber sie hat bei mir funktioniert:

date +%s000

Ich musste nur ein Datum wie 2012-05-05 in Millisekunden konvertieren.

11
Pablo

Wirf das einfach raus, aber ich denke, die richtige Formel für die Division wäre:

echo $(($(date +%s%N)/1000000))
10
WillB

Für die Leute, die vorschlagen, externe Programme auszuführen, um das zu bekommen millisekunden ... bei dieser Geschwindigkeit können Sie dies genauso gut tun:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

Der Punkt ist: Bevor Sie eine Antwort von hier auswählen, denken Sie bitte daran, dass nicht alle Programme unter einer ganzen Sekunde ausgeführt werden. Messen!

7
Camilo Martin

Diese Lösung funktioniert unter macOS.

Wenn Sie ein Bash-Skript verwenden möchten und Python verfügbar) haben, können Sie diesen Code verwenden:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'
7
Frank Thonig

Wenn Sie nach einer Möglichkeit suchen, die Ausführungsdauer Ihres Skripts anzuzeigen, erhalten Sie Folgendes (nicht vollständig genaues) Ergebnis:

Geben Sie so nahe wie möglich am Anfang Ihres Skripts Folgendes ein

basetime=$(date +%s%N)

Dies gibt Ihnen einen Startwert von etwa 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 anzeigen

runtime: 12.383 seconds

Anmerkungen:

(1 * 10 ^ 09) kann auf Wunsch durch 1000000000 ersetzt werden

"scale=3" ist eine eher seltene Einstellung, die bc dazu zwingt, das zu tun, was Sie wollen. Es gibt noch viel mehr!

Ich habe dies nur unter Windows 7/MinGW getestet ... Ich habe keine richtige * nix-Box zur Hand.

3
user161733

Hier erfahren Sie, wie Sie Zeit in Millisekunden erhalten, ohne eine Division durchzuführen. Vielleicht ist es schneller ...

# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715

Update: Eine andere Alternative in reinem Bash, die nur mit Bash 4.2+ funktioniert, ist dieselbe wie oben, verwenden Sie jedoch printf, um das Datum abzurufen. Es wird definitiv schneller sein, da keine Prozesse vom Hauptprozess getrennt sind.

printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}

Ein weiterer Haken dabei ist, dass Ihre strftime -Implementierung %s Und %N Unterstützen sollte, was auf meinem Testcomputer nicht der Fall ist. Unter man strftime Finden Sie unterstützte Optionen. Siehe auch man bash, Um die Syntax printf anzuzeigen. -1 Und -2 Sind spezielle Zeitwerte.

2
akostadinov

Hier wird nichts Revolutionäres über die akzeptierte Antwort hinzugefügt, sondern nur, um sie für diejenigen von Ihnen, die neu in Bash sind, leicht wiederverwendbar zu machen. Beachten Sie, dass dieses Beispiel unter OS X und älteren Bash-Versionen funktioniert, was für mich persönlich eine Voraussetzung war.

nowInMs() {
  echo "$(($(date +'%s * 1000 + %-N / 1000000')))"
}

Jetzt kannst du rennen

TIMESTAMP="$(nowInMs)";

Der genaueste Zeitstempel, den wir erhalten können (zumindest für Mac OS X), ist wahrscheinlich folgender:

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 Bruchs schneiden und zu Beginn den durchschnittlicher Overhead des Ablesens der Zeit berechnen und ihn 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 Echo-Befehle auskommentieren, um besser zu sehen, wie es funktioniert.

Die Ergebnisse für dieses Skript sind normalerweise eines dieser drei Ergebnisse:

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01
2
ishahak

Wenn Sie Datum und Ausdruck verwenden, gelangen Sie dorthin, d. H.

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 Epoche keine Millisekunden mehr gibt, aber es kann in einigen Fällen immer noch als Antwort nützlich sein. Alles hängt davon ab, wofür Sie es wirklich benötigen. Multiplizieren Sie es mit 1000, wenn Sie eine Millisekundenzahl benötigen: D.

Am einfachsten wäre es, eine kleine ausführbare Datei (von C f.ex.) zu erstellen und sie dem Skript zur Verfügung zu stellen.

1
Johan Andersson

Zusammenfügen der vorherigen Antworten unter OS X,

ProductName:    Mac OS X
ProductVersion:    10.11.6
BuildVersion:    15G31+

du kannst gerne machen

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"
}
1
loretoparisi

(Wiederholung aus vorherigen Antworten) date +%N funktioniert unter OS X nicht, aber Sie können auch Folgendes verwenden:

Perl (erfordert das Modul Time :: Format). Vielleicht ist es nicht das beste CPAN Modul, aber es erledigt den Job. 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"})'
1
TVNshack

Wenn Sie eine einfache Shell-Berechnung benötigen, ist diese einfach und portabel und verwendet Frank Thonigs 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
0
Bill Cheswick

Für Alpine Linux (viele Docker-Images) und möglicherweise andere minimale Linux-Umgebungen können Sie adjtimex missbrauchen:

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

adjtimex wird zum Lesen (und Setzen) von Kernelzeitvariablen verwendet. Mit awk können Sie die Mikrosekunden abrufen, und mit head können Sie nur die ersten 3 Ziffern verwenden.

Ich habe keine Ahnung, wie zuverlässig dieser Befehl ist.

Hinweis: Schamlos gestohlen von diese Antwort

0
Qw3ry