正在将SYSTEMTIME(本机C++)转换为DateTime(C#)

本文关键字:转换 DateTime 本机 SYSTEMTIME C++ | 更新日期: 2023-09-27 18:29:07

我有一个C++客户端与C#服务器进行通信,并且我对用户定义的类型进行了自定义序列化。

现在我需要将日期和时间结构从C++传递到C#。谷歌搜索导致了以下方法:

  1. 在SYSTEMTIME结构中填写日期/时间(这不是当前的系统时间。而是由程序根据特定条件填写)
  2. 将SYSTEMTIME转换为FILETIME
  3. 将FILETIME转换为__int64(这提供了一个64位值,表示从1601年1月1日起100纳秒的间隔数)
  4. 在C#中DateTime的构造函数中使用此64位值

只是为了测试一下,我写了两个片段,一个在(原生)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#,反之亦然?

正在将SYSTEMTIME(本机C++)转换为DateTime(C#)

传递给DateTime构造函数的值是FILETIME,即从1601年1月1日起的100纳秒间隔数。DateTime构造函数期望的值是自0001年1月1日以来经过的100纳秒间隔数。因此产生了1600年的差异。您只需申请1600年的补偿即可解决问题。