2013-08-27 116 views
4

我有一個C++客戶端與C#服務器通信,並且我爲用戶定義的類型定製了序列化。將SYSTEMTIME(Native C++)轉換爲DateTime(C#)

現在我需要將日期和時間結構從C++傳遞到C#。谷歌搜索導致了以下方法:

  1. 填補了在SYSTEMTIME結構中的日期/時間(這不是當前的系統時間,而是將根據一定的條件,程序被填滿。)
  2. 轉換SYSTEMTIME到FILETIME
  3. 將FILETIME轉換爲__int64(這會給出一個64位值,表示從1601年1月1日開始的100納秒的間隔數)
  4. 在構造函數中將此64位值用於C#中的DateTime。

爲了測試水域,我在C++中編寫了2個片段(步驟1,2,3),另一個在C#中執行了Step4。沒有自動從C++調用到C#。

我手動拉出第3步(130220830133980000L)的值並在C#中使用它,這裏是代碼片段和我得到的輸出。

C++代碼

SYSTEMTIME st; 

GetSystemTime(&st); 

printf("\n In C++ : %04d:%02d:%02d:%02d:%02d:%02d:%03d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); 

FILETIME fileTime; 
if(!SystemTimeToFileTime(&st, &fileTime)) { 
    wcout << "Conversion from system time to file time failed. Error : " << GetLastError(); 
} 

__int64 ticks = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime; 

C#代碼

DateTime dob = new DateTime(130220830133980000L, DateTimeKind.Utc); 
Console.WriteLine("In C# : " + dob.Year + ":" + dob.Month + ":" + dob.Day + ":" + dob.Hour + ":" + dob.Minute + ":" + dob.Second + ":" + dob.Millisecond); 

輸出:

在C++:2013:08:27:13:16:53: 398

在C#中:413:8:27:13:16:53:398

除年份部分以外的所有值都可以正確檢索。 2013年的C++在C#中變成了413年。我無法弄清楚爲什麼年份發生變化。

我是否正確地進行轉換?如果有任何其他方法將日期和時間信息從C++傳遞到C#,反之亦然?

回答