2014-09-29 59 views
0

我正在嘗試將一個.Net代碼片段調整到古老的C,而不需要大量使用C++ .Net類。它看起來像這樣:相當於C的日期時間

Int64 ticks = DateTime.Now.ToBinary(); 

    WriteSigned64(address, ticks); 

在C/C++編譯的Win32進程中是否存在等價物?我發現的唯一的東西使用替代和有限的32位結構。我也必須寫這個字段與.Net版本兼容。

+4

C或C++?你的標題是C,你的問題是C/C++,你的標籤是C++。 – juanchopanza 2014-09-29 21:40:43

+1

它被稱爲Win32的原因:它是爲32位系統(以及可能不具有64位數據類型的語言)製作的。如果有64位數字,你幾乎可以肯定不得不把它作爲一個包含一對32位數字的結構來處理。 – cHao 2014-09-29 21:45:18

+0

你在找一個.NET庫嗎? **標準C++庫**中沒有處理Win32進程的任何內容。 – 2014-09-29 21:45:58

回答

1

您可以使用在time.h中聲明的函數time_t time(time_t *t);。它給你從Epoch(1970-01-01 00:00:00 +0000(UTC))開始的秒數。

time_t全部合理近期版本是64位整數。

這是一個C函數,但它可以從C++程序調用。

+0

並且轉換爲'DateTime'兼容的刻度編號,乘以'10000000'並添加'621355968000000000'。 – 2014-09-29 22:12:34

1

沒有任何直接的方式來做你所問的問題,並且它仍然執行與你提供的代碼完全相同的方式。

DateTime.ToBinary()不只是蜱蟲。它將DateTime對象的TicksKind屬性編碼爲單個二進制值。請參閱documentation on MSDN。你也可以參考.NET Reference Source

爲了說明這一點,考慮下面的C#代碼:

DateTime dt = DateTime.Now; 
Console.WriteLine(dt.Kind); 
Console.WriteLine(dt.Ticks); 
Console.WriteLine(dt.ToBinary()); 

樣本輸出:

Local 
635476072989775339 
-8587895711865000469 

你也應該認識到,DateTime.Now返回Local樣,這意味着蜱是基於本地運行代碼的計算機的時區。如果您從一個系統獲取刻度(或二進制)並在具有不同時區的系統上重新創建DateTime,則會得到與您最初編碼的值不同的值。

相比之下,time_t和C/C++中的大多數其他時間相關類型都基於UTC,因此該值沒有不明確之處。