C# サーバーと通信する C++ クライアントがあり、ユーザー定義型のカスタム シリアル化があります。
ここで、日付と時刻の構造体を C++ から C# に渡す必要があります。グーグルは次のアプローチにつながりました:
- SYSTEMTIME 構造体に日付/時刻を入力します (これは現在のシステム時刻ではありません。特定の条件に基づいてプログラムによって埋められます)。
- SYSTEMTIME を FILETIME に変換する
- FILETIME を __int64 に変換します (これにより、1601 年 1 月 1 日からの 100 ナノ秒間隔を表す 64 ビット値が得られます)
- C# の DateTime のコンストラクターでこの 64 ビット値を使用します。
水域をテストするためだけに、ステップ 1、2、3 を実行する (ネイティブ) C++ とステップ 4 を実行する C# の 2 つのスニペットを作成しました。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
年の部分を除くすべての値を正しく取得できます。C++ の 2013 年は、C# では 413 になります。年の部分が変わる理由がわかりません。
変換を正しく行っていますか? C++ から C# に、またはその逆に日付と時刻の情報を渡す別の方法はありますか?