java - 如何获取当前TAI时间?

标签 java c++ linux leap-second tai-time

如何使用 Java 或 C++ 在 Linux 中获取当前 TAI 时间(以毫秒为单位)?

我需要它的原因是能够在很长一段时间内(以年为单位)准确地获取时间戳,并且仍然能够比较它们,而不必担心闰秒。闰秒期间可能会发生多次测量,并且所有测量都需要明确、单调递增和线性递增。这将是一个专用的 Linux 服务器。这是一个需要大约 0.5 秒精度的科学项目。

我目前不希望投资 GPS 计时器,并希望使用 NTP 到 pool.ntp.org 以使系统时钟保持在正轨上。

我研究了以下解决方案:

Java 8 或 ThreeTen 项目 获得 TAIInstant 的唯一方法是使用 Instant 然后对其进行转换,根据规范,“根据 UTC-SLS,从 Instant 进行的转换在闰秒附近不会完全准确。”这本身没什么大不了的(事实上,使用 UTC-SLS 也是可以接受的)。然而,在 Instant 类中使用 now() 似乎也只是对 System.currentTimeMillis() 的包装,这让我觉得在闰秒期间,时间仍然会不明确,项目实际上不会给我 TAI 时间. Java 8 规范还规定:

Implementations of the Java time-scale using the JSR-310 API are not required to provide any clock that is sub-second accurate, or that progresses monotonically or smoothly. Implementations are therefore not required to actually perform the UTC-SLS slew or to otherwise be aware of leap seconds.

使用权利/?时区 这似乎可行,但我不确定该实现是否足够智能以在闰秒期间继续工作,或者 System.currentTimeMillis() 是否甚至会给 TAI 时间。换句话说,底层实现是否仍然使用 UTC,从而在闰秒期间给出一个模糊的时间,然后将其转换为 TAI,或者使用正确的/时区实际上总是使用 System.currentTimeMillis() 与 TAI 一起工作(即即使在闰秒)?

使用 CLOCK_TAI 我尝试在 Linux 内核中使用 CLOCK_TAI,但在我的测试中发现它与 CLOCK_REALTIME 完全相同: 代码:

#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;
}

输出很简单:

1427744797
6896
1427744797

使用 CLOCK_MONOTONIC 这样做的问题是,即使计算机重新启动,时间戳也需要保持有效和可比性。

最佳答案

CLOCK_REALTIMECLOCK_TAI 返回相同的值,因为内核参数 tai_offset 为零。

使用adjtimex(timex tmx)检查并读取值。我认为如果 ntpd 足够新 (>4.2.6) 并且有一个闰秒文件,它就会设置它。它也可能能够从上游服务器获取它,但我无法验证。以 root 身份运行时,调用 adjtimex() 可以手动设置 tai_offsetadjtimex 需要一个新的 man 页面来查看要设置的参数。我的 debian man 页面太旧,但命令有效。

关于java - 如何获取当前TAI时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29355406/

相关文章:

c++ - 资源 union 引发 SFML 中字体的访问冲突

Java 运行时崩溃并出现 fatal error

c - posix_memalign 与 mmap 有何不同

java - 获取双变量函数的梯度

java - 反序列化期间出现异常

java - jdbc 瘦驱动程序中的机器名称而不是 ipaddress

c++ - OpenGL 3.3 MSAA 延迟着色

java - Selenium - 写入网络驱动器。可以写入文本文件,但不能写入图像文件

javascript - QML:将 JS 对象传递给 C++ 成员函数

php - 帮助创建 ZIP 文件 Windows 不会阻止