我有一個C++客戶端與C#服務器通信,並且我爲用戶定義的類型定製了序列化。將SYSTEMTIME(Native C++)轉換爲DateTime(C#)
現在我需要將日期和時間結構從C++傳遞到C#。谷歌搜索導致了以下方法:
- 填補了在SYSTEMTIME結構中的日期/時間(這不是當前的系統時間,而是將根據一定的條件,程序被填滿。)
- 轉換SYSTEMTIME到FILETIME
- 將FILETIME轉換爲__int64(這會給出一個64位值,表示從1601年1月1日開始的100納秒的間隔數)
- 在構造函數中將此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#,反之亦然?