Frage Wie bekomme ich die aktuelle Unix-Zeit in Millisekunden in bash?


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


197
2018-06-14 16:04


Ursprung




Antworten:


Diese:

date +%s 

wird die Anzahl von zurückgeben Sekunden seit der Epoche.

Diese:

date +%s%N

gibt die Sekunden und die aktuellen Nanosekunden zurück.

So:

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)) (Division durch 1000 bringt nur Mikrosekunden)


233
2018-06-14 16:10



Ich frage mich, wie viele ms der Schnitt hinzufügt :-) - Kyle Brandt♦
Oder wenn Sie alles in der Shell erledigen wollen, vermeiden Sie den teuren Overhead eines zusätzlichen Prozesses (wir vermeiden das Problem, wenn sich die Anzahl der Ziffern in% + s + N ändert): echo $(($(date +%s%N)/1000)) - MikeyB
Es ist das Prinzip der Sache ... Vermeiden Sie magische Zahlen und Code, was Sie eigentlich bedeuten. - MikeyB
Ich denke, es ist erwähnenswert, dass der Mann nach Unix und nicht nach Linux gefragt hat, und die aktuelle Top-Antwort (Datum +% s% N) funktioniert nicht auf meinem AIX-System. - Pete
@Pete +1 Gleiches gilt für OS X und FreeBSD - ocodo


Sie können einfach verwenden %3N um die Nanosekunden auf die 3 höchstwertigen Ziffern abzuschneiden (die dann Millisekunden sind):

$ date +%s%3N
1397392146866

Dies funktioniert z.B. auf meinem Kubuntu 12.04.

Aber sei dir bewusst, dass %N kann je nach Zielsystem nicht implementiert werden. Z.B. Getestet auf einem Embedded-System (buildroot rootfs, kompiliert mit einer nicht-HF-Arm Cross Toolchain) gab es keine %N:

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

(Und auch mein (nicht gerootetes) Android Tablet hat keine %N).


79
2018-04-13 12:34



@warren: Ich habe gesehen, dass du das bearbeitet und verändert hast 1397392146%3N zu 1397392146%N, aber die Ausgabe von 1397392146%3N ist das, was ich wirklich auf der busybox-konsole meines android tablet gesehen habe. Können Sie Ihren Schnitt erklären? - Joe
Warrens Kommentar aus der Geschichte ist "von 3 auf 6 geändert, da 3 nur zu Mikrosekunden führt". Sein Schnitt scheint völlig falsch zu sein; Sie sollten es zurückrollen. - bukzor
Dies ist eine Besonderheit von GNU Coreutils. Letztendlich wird dies hier in gnulib implementiert: github.com/gagern/gnulib/blob/.... - telotortium
wahrscheinlich macht da ein Punkt Sinn. date +%s.%3N Drucke 1510718281.134. - darksky


date +%N funktioniert nicht unter OS X, aber Sie könnten einen von

  • Rubin: 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);'
  • die Internets: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • oder für auf die nächste Sekunde gerundete Millisekunden date +%s000

51
2017-09-02 11:16



zur Vollständigkeit... node -e 'console.log(Date.now())' - slf
Mit PHP: php -r 'echo microtime(TRUE);' - TachyonVortex
Sicher, Sie müssen nur darauf warten, dass diese Dolmetscher sich aufwärmen. Das funktioniert auch: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N - Camilo Martin
Oder, wenn Sie brauche eigentlich nicht die Millisekunden aber nur das richtige Format: date +%s000 - Lenar Hoyt
apple.stackexchange.com/questions/135742/... hat Anweisungen dazu in OSX über Brews coreutils - sameers


Ich werfe das hier raus, aber ich denke, die richtige Formel mit der Division wäre:

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

8
2017-09-07 21:22





Meine Lösung ist nicht die beste, hat aber für mich funktioniert.

date +%s000

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


6
2018-05-09 20:11



Erstaunlicher Hack, lol :) - k06a
Du musst jemand unter meinen Mitarbeitern sein. - Nakilon


Für die Leute, die vorschlagen, externe Programme laufen zu lassen MilliSekunden ... bei diesem Tempo kannst du das genauso gut machen:

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

Hinweis: Bevor Sie eine Antwort von hier auswählen, beachten Sie bitte, dass nicht alle Programme unter einer ganzen Sekunde laufen. Messen!


6
2018-06-23 13:17



Sie fragen nicht das lokale System für die Zeit. Was ich denke, ist in der Frage impliziert. Sie sind auch auf eine Netzwerkverbindung angewiesen. - orkoden
@orkoden Die Frage fragt explizit nach "Anzahl der Millisekunden seit Unix-Epoche 1. Januar 1970". Außerdem möchte ich darauf hinweisen, dass man niemals ganz Ruby oder Python (oder wget) hochfeuern sollte, nur um die Zeit zu bekommen - entweder durch einen schnellen Kanal oder durch Millisekunden. - Camilo Martin
Ja, ich habe verstanden, dass Sie eine schlechtere Lösung gegeben haben, um die Mängel der schlechten Lösungen aufzuzeigen. Ich habe mehrere Lösungen ausprobiert und die Zeit gemessen. lpaste.net/119499 Die Ergebnisse sind irgendwie interessant. Sogar auf einer sehr schnellen i7 Maschine date dauert 3 ms zum Ausführen. - orkoden
@orkoden Schöne Tests! Welches OS? Dies hat möglicherweise etwas mit dem Overhead des Prozesslaichens zu tun. - Camilo Martin
@ Nakilon und deshalb sollte man sich nicht auf curl-fähige Bequemlichkeiten wie jene für irgendetwas Produktion verlassen. - Camilo Martin


Diese Lösung funktioniert auf macOS.

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

#!/bin/bash

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

3
2018-02-05 14:26



Warum die Abstimmung stimmen? - Frank Thonig
Scheint nicht besonders gerechtfertigt. Der Hinweis auf den Abwärtspfeil sagt "Diese Antwort ist nicht nützlich", aber IMO ist es nützlich. Vielleicht wollten sie, dass du stattdessen ein Python-Skript erstellst. Das wäre einfacher und funktioniert auch als Bash-Befehl. - Andrew Schulman
Mach dir keine Sorgen über downvotes (es war nicht meins) ... vor allem, wenn sie anonym sind (von denen man nicht lernen kann, was falsch zu sein scheint, oder?). Nur um zu helfen, verarbeitest du es ... hier geht noch ein +1 ... rate mal was: DU darf jetzt auch "abstimmen", oder? - Pierre.Vriens
Der Downvote scheint durch ein Problem mit dem System verursacht worden zu sein. Es wurde seitdem wieder vom System entfernt. - Michael Hampton♦


Wenn Sie nach einer Möglichkeit suchen, wie lange das Skript ausgeführt wurde, erhalten Sie im Folgenden ein (nicht vollständig 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 etwa 1361802943996000000

Verwenden Sie am Ende Ihres Skripts Folgendes

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

was etwas wie anzeigen wird

runtime: 12.383 seconds

Anmerkungen:

(1 * 10 ^ 09) kann mit 1000000000 ersetzt werden, wenn Sie möchten

"scale=3" ist eine eher seltene Einstellung, die zwingt bc zu tun, was du willst. Es gibt viel mehr!

Ich habe das nur auf Win7 / MinGW getestet ... Ich habe keine richtige * nix-Box zur Hand.


2
2018-02-25 14:48



oder du könntest es einfach benutzen time <script> - warren


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 mit bash 4.2+ ist das gleiche wie oben, aber verwenden printf um das Datum zu bekommen. Es wird definitiv schneller sein, weil keine Prozesse von der Hauptkette getrennt werden.

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

Ein weiterer Haken hier ist, dass Sie strftime Umsetzung sollte unterstützen %s und %N was auf meiner Testmaschine NICHT der Fall ist. Sehen man strftime für unterstützte Optionen. Siehe auch man bashsehen printf Syntax. -1 und -2 sind spezielle Werte für die Zeit.


2
2018-02-10 09:05



Scheint wie mein strftime(3) unterstützt nicht %N also kein Weg für printf um Nanosekunden zu drucken. Ich benutze Ubuntu 14.04. - haridsv
@haridsv, ja, es ist nicht in glibc. date scheint die verlässlichere Option zu sein. - akostadinov


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

python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'

1490665305.021699

Aber wir müssen daran denken, dass es ungefähr 30 Millisekunden dauert, um zu laufen. Wir können es auf die 2-stellige Fraktion reduzieren, und am Anfang berechnen wir die durchschnittlicher Aufwand die Zeit zu lesen und dann von der Messung zu 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 sehen zu können, wie es funktioniert.

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

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01

2
2018-03-28 02:13





Mit Datum und Ausdruck können Sie dorthin gelangen d.h.

X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X

Erweitern Sie es einfach, um zu tun, was Sie wollen

Ich weiß, dass dies keine Millisekunden seit der Epoche gibt, aber es könnte immer noch als eine Antwort für einige der Fälle nützlich sein, alles hängt davon ab, wofür du es wirklich brauchst, multipliziere mit 1000, wenn du eine Millisekundenzahl brauchst: D

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


1
2017-11-25 15:06



Es läuft ein potenzielles Problem date mehrmals. In manchen Fällen kann sich das Datum oder die Uhrzeit zwischen den Läufen ändern, wenn Ihr Befehl geschrieben wird. Es ist besser zu rennen date einmal und analysieren Sie die Teile und machen Sie Ihre Berechnung. Eine von mehreren Möglichkeiten wäre das t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x". Dies verwendet die Bash-Syntax, da die Frage markiert ist bash. Wie du anspielst, gibt deine Antwort (und meine Variation) nur Sekunden für den gegenwärtigen Tag und nicht seit der Epoche und nicht in Millis. - Dennis Williamson