我有一个 C++ 客户端与 C# 服务器通信,并且我有用户定义类型的自定义序列化。
现在我需要将日期和时间结构从 C++ 传递到 C#。谷歌搜索导致了以下方法:
- 填写 SYSTEMTIME 结构中的日期/时间(这不是当前系统时间。而是由程序根据某些条件填写)
- 将 SYSTEMTIME 转换为 FILETIME
- 将 FILETIME 转换为 __int64(这给出了一个 64 位值,表示从 1601 年 1 月 1 日开始的 100 纳秒间隔数)
- 在 C# 中的 DateTime 的构造函数中使用这个 64 位值。
只是为了测试水域,我编写了 2 个片段,一个在(本机)C++ 中执行步骤 1、2、3,另一个在 C# 中执行步骤 4。还没有从 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#,反之亦然?