Wie erhalte ich die aktuelle TAI-Zeit?

Wie kann ich die aktuelle TAI-Zeit in Millisekunden unter Linux mit Java oder C ++ ermitteln?

Der Grund, warum ich das brauche, ist, in der Lage zu sein, Zeitstempel über einen langen Zeitraum (in der Größenordnung von Jahren) genau zu erfassen und sie dennoch zu vergleichen, ohne sich Gedanken über Schaltsekunden zu machen. Es ist möglich, dass während einer Schaltsekunde mehrere Messungen stattfinden und alle Messungen eindeutig, monoton ansteigend und linear ansteigend sein müssen. Dies wird ein dedizierter Linux-Server sein. Dies ist für ein wissenschaftliches Projekt, das eine Genauigkeit von etwa 0,5 Sekunden benötigt.

Ich möchte derzeit nicht in einen GPS-Zeitnehmer investieren und hoffe, NTP für pool.ntp.org zu verwenden, um die Systemuhr auf dem Laufenden zu halten.

Ich habe folgende Lösungen geprüft:

Java 8 oder das ThreeTen Project Die einzige Möglichkeit, eine TAIInstant zu erhalten, besteht darin, einen Instant zu verwenden und anschließend zu konvertieren. Laut Spezifikation ist die Konvertierung von einem Instant in der Nähe einer Schaltsekunde gemäß UTC-SLS nicht vollständig genau. " Das ist an und für sich keine große Sache (in der Tat wäre die Verwendung von UTC-SLS auch akzeptabel). Die Verwendung von now () in der Instant-Klasse scheint jedoch auch nur ein Wrapper für System.currentTimeMillis () zu sein, sodass ich denke, dass die Zeit in der Schaltsekunde immer noch nicht eindeutig ist und das Projekt mir keine TAI-Zeit gibt . In den Java 8-Spezifikationen heißt es außerdem:

Implementierungen der Java-Zeitskala mit der JSR-310-API sindnicht erforderlich, um eine Uhr mit einer Genauigkeit von weniger als einer Sekunde bereitzustellen, oder die monoton oder reibungslos abläuft. Implementierungen sind daher nicht erforderlich, um das UTC-SLS-Slew tatsächlich durchzuführen oder Schaltsekunden auf andere Weise zu kennen.

Mit einem Recht /? Zeitzon Dies scheint zu funktionieren, ich bin mir jedoch nicht sicher, ob die Implementierung intelligent genug ist, um in einer Schaltsekunde weiterzuarbeiten, oder ob System.currentTimeMillis () sogar TAI-Zeit geben würde. Mit anderen Worten, würde die zugrunde liegende Implementierung immer noch UTC verwenden und somit eine mehrdeutige Zeit während der Schaltsekunde angeben, die dann in TAI konvertiert wird, oder würde die Verwendung einer Rechts- / Zeitzone tatsächlich immer mit TAI unter Verwendung von System.currentTimeMillis () funktionieren (dh sogar während Schaltsekunde)

Mit CLOCK_TAI Ich habe versucht, CLOCK_TAI im Linux-Kernel zu verwenden, fand es aber in meinem Test völlig identisch mit CLOCK_REALTIME: Code:

#include <iostream>
#include <time.h>

long sec(int clock)
{
    struct timespec gettime_now;
    clock_gettime(clock, &gettime_now);
    return gettime_now.tv_sec;
}

int main()
{
    std::cout << sec(0) << std::endl;       // CLOCK_REALTIME
    std::cout << sec(1) << std::endl;       // CLOCK_MONOTONIC
    std::cout << sec(11) << std::endl;      // CLOCK_TAI

    return 0;
}

Die Ausgabe war einfach:

1427744797
6896
1427744797

Mit CLOCK_MONOTONIC Das Problem dabei ist, dass die Zeitstempel gültig und vergleichbar bleiben müssen, auch wenn der Computer neu gestartet wird.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage