如何在Linux中使用Java或C++獲取當前TAI時間(以毫秒爲單位)?如何獲取當前的TAI時間?
我需要這個的原因是能夠準確地在很長一段時間內(大約幾年)獲取時間戳,並且仍然能夠比較它們,而不用擔心閏秒。在閏秒期間進行多次測量是可能的,並且所有測量都需要明確,單調增加併線性增加。這將是一個專用的Linux服務器。這是一個需要大約0.5秒精度的科學項目。
我目前不想投資GPS計時器,並希望將NTP用於pool.ntp.org以保持系統時鐘正常運行。
我已經調查了以下解決方案:
的Java 8或ThreeTen項目 獲得TAIInstant是使用即時然後將其轉換其中,根據規範,「轉換的唯一途徑根據UTC-SLS,即時通訊在閏秒附近不會完全準確。「這本身並不是什麼大問題(事實上,使用UTC-SLS也是可以接受的)。然而,在Instant類中使用now()也似乎只是System.currentTimeMillis()的一個包裝,這讓我認爲在閏秒期間,時間仍然不明確,項目實際上不會給我TAI時間。在Java 8個規範也狀態:
使用JSR-310 API的Java時間尺度的實現都不 需要提供任何時鐘,亞秒準確,或者說 進展單調地或平滑地 。因此實現方式不需要實際執行UTC-SLS擺動或者以其他方式知道閏秒,即 。
使用權利/?時區 這似乎是可行的,但我不知道如果實施足夠聰明,可以在閏秒內繼續工作,或者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 問題在於時間戳需要即使計算機重新啓動,仍保持有效和可比較。
你的圖書館如何處理長期的閏秒?換句話說,如果一個應用程序在未來幾年內重新啓動,我如何確保它具有過去幾年發生的閏秒知識? – 2015-10-13 01:46:49
@DanielCentore可以通過自己更新您的閏秒數據導入新的閏秒 - 無論是通過新版本的庫還是通過更新tzdata模塊(事實上從iana.org/tz導入新的tzdb版本)。 Time4J還管理[過期標誌](http://time4j.net/javadoc-en/net/time4j/scale/LeapSeconds.html#getDateOfExpiration--),如果閏秒數據可用於將警報編程給系統管理員已經變老了。請記住,無法將數據提前6個月保持有效狀態。 – 2015-10-13 11:54:14
是否有推薦的方法來自動從互聯網上下載資源來自動處理這個問題? – 2015-10-13 17:34:48