Zeit in Millisekunden seit Epoche im Terminal

Wie bekomme 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

Antworten (4)

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 ein Problem sein kann, empfehle 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, nach der Installation den Vorschlägen des Installers zu folgen). Jetzt installieren wir coreutils mit brew.

brew install coreutils

Wie die Installation sagt, wurden alle Befehle mit dem Präfix 'g' installiert (zB gdate, gcat, gln, etc etc). Wenn Sie diese Befehle wirklich mit ihren normalen Namen verwenden müssen, können Sie Ihrem PATH ( ~/.bash_profile) ein "gnubin"-Verzeichnis hinzufügen, wie zum Beispiel:

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

Sie können jetzt laufen

gdate +%s.%N

und dies wird Ihre Zeit seit der Epoche in Millisekunden ausgeben.

Nett. Ich musste nicht einmal den Pfad hinzufügen, gdatewurde in installiert /usr/local/bin/gdate.
Das würde man erwarten. Alle Binärdateien werden mit dem Präfix g installiert. In dem Pfad, den ich bereitgestellt habe, sind alle gleichen gnu-coreutils ohne das g-Präfix. Wenn Sie es also wie PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" in Ihren Pfad einfügen, wird es die Originale ersetzen. So wird OS X datezu GNU date(statt gdate)
Schön das es geklappt hat.
Technisch gesehen gibt das +%s.%NFormat die Sekunden bis auf Nanosekunden genau an, nicht Millisekunden. Nachdem ich brew zum Installieren verwendet gdatehatte, überprüfte ich die Manpage, um zu sehen, 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 habe festgestellt, dass der Befehl, um die Sekunden nur auf Millisekunden genau (dh drei Dezimalstellen) herunterzubekommen, gdate +%s.%3N.

Führen Sie in OS X einfach aus, date +%sda OS X keine höhere Genauigkeit als diese in dateder Ausgabe von unterstützt und jede überschüssige Genauigkeit, die nicht von der internen Darstellung unterstützt wird, gegen minus unendlich gekürzt wird.

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

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

Quelle für den obigen Befehl: Unix.SE – So erhalten Sie Millisekunden seit der Unix-Epoche

Wenn Sie nur einen Befehl wünschen, der in OS X die richtige Anzahl von Nullen anhängt, können Sie Folgendes verwenden:

date +%s000
OS X unterstützt nicht %-N, also macht das nichts (und könnte Probleme verursachen, wenn die Shell-Variable $Ngesetzt ist). Verwenden Sie einfach date +%s000(oder date +%s.000wenn Sie den Dezimalpunkt wollen).
@Gordon Ja, ich habe das erwähnt, aber wenn OP nach einer tragbaren Lösung sucht, die auf Systemen, die zu dieser Präzision in der Lage sind, 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 Genauigkeit unterstützen, wäre nicht ideal.
Ah ich sehe. Da der dateBefehl von OS X jedoch nur %-Nals übergeben Nwird, kann dies die Berechnung stören. Versuchen Sie die Einstellung N=7000000000000000000, dann versuchen Sie den Befehl ... Dies ist in der Praxis ein unwahrscheinlicher Fall, aber ich würde mich mit etwas sicherer fühlen, das nicht von der Umgebung abhängt.
@Gordon In der Tat würde das Setzen der Variablen es kaputt machen - ich nehme an, die spezifische Variable könnte zurückgesetzt werden, kurz bevor der Befehl ausgeführt wird, aber das Zurücksetzen solcher Variablen ist etwas, das jedes gute Skript tun sollte, bevor Befehle ausgeführt werden, imo, nur für den Fall. Dies alles basiert natürlich auf meiner Annahme, dass das OP eine vom Skript bearbeitete Antwort möchte, die das wörtliche Anhängen von Nullen enthält.
Das OP hat nach "Zeit seit der Epoche in Millisekunden" gefragt. Dies ist eine Antwort darauf, wie Nullen zu einer Zeichenfolge hinzugefügt werden. Nicht das gleiche. Obwohl in der Post erklärt, keine Antwort auf die Frage.
@CousinCocaine Diese Antwort ist für das Skripting. Die Installation Ihres eigenen datefunktioniert auf Ihrem Computer einwandfrei, ist jedoch gegen portables Skripting nutzlos. Für die Portabilität bietet dies den nächstmöglichen Wert.
@GeorgeGarside für Skripterstellung und Portabilität unter OS X haben Sie Recht.
👎 Ich bin mit der Begründung "für portables Skripting" für diese Antwort nicht einverstanden. Dies ist keine vollständige Antwort für sich. Es sollte eine Ergänzung zur akzeptierten Antwort sein. Da Homebrew das GNU-Datumstool als installiert gdate, steht es nicht mit dem vorhandenen dateTool in Konflikt. Ein portables Skript, das Millisekundenzeiten benötigt, könnte auf das Vorhandensein von prüfen gdateund es verwenden. Es würde dateggf. auf das +%s.000Format zurückgreifen. Ein sehr portables Skript würde die Ausgabe von testen dateund überprüfen, ob es die notwendigen Informationen enthält, die es ermöglichen würden, es auf verschiedenen Betriebssystemen auszuführen.

Perl ist allgegenwärtig.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
unterschätzte Antwort

Diese Lösung funktioniert unter macOS.

Wenn Sie erwägen, ein Bash-Skript zu 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 pythonSie direkt ein Skript:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 
Das obige funktioniert nur mit Python 2. Die Ausführung mit Python 3 löst einen Fehler aus. Wenn Sie die print()Funktion anstelle der printAnweisung verwenden, funktioniert es mit beiden Versionen: python -c 'from time import time; print(int(round(time() * 1000)))'Dadurch können Sie den gemeinsamen pythonBefehl verwenden, ohne sich Gedanken darüber machen zu müssen, ob er in einen Pfad für Python Version 2 oder Version 3 aufgelöst wird.
schöner Fund @CoryGross. ich danke Ihnen für das Teilen.