Zeit in Millisekunden seit der Epoche im Terminal

42

Wie erhalte ich die Zeit seit der Epoche in Millisekunden im OSX-Terminal?

Das Linux / Ubuntu-Äquivalent ist date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

Was in meinem OSX-Terminal nicht funktioniert:

OSX $ date +%s.%N
1403377800.N
Adam Matan
quelle

Antworten:

48

Das dateProgramm in OS X unterscheidet sich von GNUs coreutils- dateProgramm. Sie können coreutils (einschließlich gnu-date) installieren, dann haben Sie eine Version date, die Millisekunden unterstützt.

Da die Installation aus dem Quellcode für native OS X-Benutzer problematisch sein kann, rate ich Ihnen, Homebrew zu verwenden .

Um diese Tools mit Homebrew zu installieren, führen Sie diesen Oneliner in Ihrem Terminal aus:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew ist jetzt installiert (es ist ratsam, den Vorschlägen des Installateurs nach der Installation zu folgen). Jetzt installieren wir coreutils mit brew.

brew install coreutils

Wie in der Installation angegeben, wurden alle Befehle mit dem Präfix 'g' installiert (z. B. gdate, gcat, gln usw. usw.). Wenn Sie diese Befehle wirklich mit ihren normalen Namen verwenden müssen, können Sie Ihrem PATH ( ~/.bash_profile) ein "gnubin" -Verzeichnis hinzufügen :

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Du kannst jetzt rennen

gdate +%s.%N

und dies gibt Ihre Zeit seit der Epoche in Millisekunden aus.

CousinCocaine
quelle
3
Nett. Ich musste nicht einmal den Pfad hinzufügen, gdatewurde in installiert /usr/local/bin/gdate.
Adam Matan
Das ist, was Sie erwarten würden. Alle Binärdateien werden mit dem Präfix g installiert. In dem von mir angegebenen Pfad sind alle gleichen Gnu-Coreutils ohne das Präfix g. Wenn Sie es also wie PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" in Ihren Pfad einfügen, werden die Originale ersetzt. So wird OS X dateGNU date(anstelle von gdate)
CousinCocaine
Gut, dass es geklappt hat.
CousinCocaine
3
Technisch gesehen gibt das +%s.%NFormat die Sekunden auf Nanosekunden genau an, nicht auf Millisekunden. Nachdem ich die Installation mit brew durchgeführt hatte gdate, überprüfte ich auf der Manpage, ob Millisekunden verfügbar waren. Es ist nicht. Es wurde auch nicht gesagt, dass eine Genauigkeit für %Nangegeben werden könnte, aber ich habe es trotzdem versucht. Ich stellte fest, dass der Befehl, die Sekunden auf Millisekunden genau zu bringen (dh drei Dezimalstellen), lautet gdate +%s.%3N.
LS
10

In OS X wird nur ausgeführt, date +%sweil OS X keine höhere Genauigkeit als die in dateder Ausgabe unterstützte unterstützt. Übermäßige Genauigkeit, die von der internen Darstellung nicht unterstützt wird, wird in Richtung minus unendlich abgeschnitten.

Wenn Sie eine Millisekunden-Ausgabe wünschen, können Sie den folgenden Befehl verwenden, obwohl die Ausgabe nur durch das Anhängen von Nullen korrigiert wird, anstatt aus dem oben genannten Grund die Genauigkeit zu erhöhen. Das Folgende gibt korrekte Millisekunden auf Systemen aus, die die erforderliche Präzision unterstützen.

echo $(($(date +'%s * 1000 + %-N / 1000000')))

Quelle für obigen Befehl: Unix.SE - Wie man Millisekunden seit der Unix-Epoche abruft

Wenn Sie nur einen Befehl benötigen, der die richtige Anzahl von Nullen in OS X anfügt, können Sie Folgendes verwenden:

date +%s000
grg
quelle
OS X unterstützt %-Ndies nicht und kann daher Probleme verursachen, wenn die Shell-Variable gesetzt $Nist. Verwenden Sie einfach date +%s000(oder date +%s.000wenn Sie den Dezimalpunkt möchten).
Gordon Davisson
@ Gordon Ja, ich habe dies erwähnt, aber wenn OP nach einer tragbaren Lösung sucht, die auf Systemen mit dieser Genauigkeit erfolgreich funktioniert, funktioniert der obige Befehl. Natürlich könnten Sie einfach Nullen an die Ausgabe anhängen, aber das Kopieren auf andere Systeme, die die zusätzliche Präzision unterstützen, wäre nicht ideal.
grg
Ah ich sehe. Da der OS X- dateBefehl jedoch nur %-Nas durchläuft N, kann die Berechnung beeinträchtigt werden. Versuchen Sie es mit der Einstellung N=7000000000000000000und dann mit dem Befehl ... In der Praxis ist dies ein unwahrscheinlicher Fall, aber ich würde mich mit etwas sicherer fühlen, das nicht von der Umgebung abhängt.
Gordon Davisson
@Gordon In der Tat würde das Setzen der Variablen sie zerstören - ich nehme an, die spezifische Variable könnte kurz vor dem Ausführen des Befehls zurückgesetzt werden, aber das Zurücksetzen von Variablen sollte jedes gute Skript tun, bevor es Befehle ausführt, imo, nur für den Fall. Dies alles basiert natürlich auf meiner Annahme, dass das OP eine Skript-editierte Antwort mit dem wörtlichen Anhängen von Nullen wünscht.
grg
2
Das OP fragte nach "Zeit seit der Epoche, in Millisekunden". Dies ist eine Antwort darauf, wie man Nullen zu einer Zeichenfolge hinzufügt. Nicht das gleiche. Obwohl in der Post erklärt, keine Antwort auf die Frage.
CousinCocaine
6

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))'

Oder schreiben Sie ein pythonSkript direkt:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 
Frank Thonig
quelle
4

Perl ist allgegenwärtig.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
ernix
quelle