2011-03-09 50 views
1

我正在尋找關於獲取utc時間的代碼。關於C++中的posix ftime

static const long long SECSEPOCHS = 11644473600ll; 
static const long long SECSto100nanosecs = 10000000ll; 
static const long long MSECSto100nanosecs = 10000ll; 
longlong mytime; 
struct timeb now; 

ftime(&now); 
mytime = now.time; 
mytime += SECSEPOCHS 
mytime *= SECSto100nanosecs; 
mytime += now.millitm * MSECSto100nanosecs; 

我對以上代碼有如下問題。 什麼是神奇數字「11644473600ll」,我們如何得到這個數字,以及爲什麼我們將這個數字添加到now.time,這是由ftime返回的。 epcoh是什麼意思?

由於

回答

1

時元是指用來計算更多事件的參考時間。例如,如果我決定2000年1月1日是參考時間(EPOCH),那麼每當我說「過去1年」時。這意味着它是2001年1月1日,因爲我們的參考是2000年。

Windows NT時間被指定爲1601年1月1日以來的100納秒間隔的數量。UNIX時間被指定爲自1月1日以來的秒數,1970年。這些日期之間有134,774天(或11,644,473,600秒)。

2

曆元是午夜UTC,1970年1月1日,底座爲unixtime。神奇的數字是用來在轉換unixtime和微軟的FILETIME它開始於午夜UTC之間,1月1日1601

你的代碼執行以下操作:

ftime(&now); 
mytime = now.time; // Get unixtime right now 
mytime += SECSEPOCHS; // Adjust to seconds since microsoft's 1601 epoch 
mytime *= SECSto100nanosecs; // Convert to 100-nanosecond units 
mytime += now.millitm * MSECSto100nanosecs; // Add the millisecond part of the unixtime 

結果是一個值,它是適合於MS的FILETIME結構。

+0

他們的OS或C庫函數不是他們的轉換嗎? (我找不到任何快速 - 只有SystemTimeToFileTime這是別的 - 但我很驚訝,如果他們不存在) – Rup 2011-03-09 09:59:03

+0

我一直寫自己的轉換,從來沒有找到或看到任何直接的轉換機制。 – Erik 2011-03-09 10:01:11

+0

是,如果我們僅在內部使用unix系統,我們不必使用幻數來調整秒。我對嗎? – venkysmarty 2011-03-09 10:03:19

1

ftime返回Unix時間,自1970年1月1日00:00:00 UTC開始計時,以秒計。其餘代碼將其轉換爲Windows NT文件時間,該時間自UTC 1月1日1601 00:00:00以來的100納秒單位計算。 「時代」是「時間的開始」,而11644473600是自NT時代開始以秒爲單位表示的Unix時代。