gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:45:24 26 4
gpt4 key购买 nike

如何使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com