将SYSTEMTIME(Native C++)转换为DateTime(C#)

San*_*osh 4 c# c++ datetime

我有一个C++客户端与C#服务器通信,我有用户定义类型的自定义序列化.

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

  1. 填写SYSTEMTIME结构中的日期/时间(这不是当前系统时间.而是基于某些条件由程序填写)
  2. 将SYSTEMTIME转换为FILETIME
  3. 将FILETIME转换为__int64(这给出了一个64位值,表示从1601年1月1日开始的100纳秒间隔的数量)
  4. 在构造函数中将此64位值用于C#中的DateTime.

为了测试水域,我在(本机)C++中写了两个片段,它们执行步骤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;
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

输出:

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

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

可以正确检索除年份部分之外的所有值.C++中的2013年在C#中变为413.我无法弄清楚为什么年份部分会发生变化.

我正确地进行了转换吗?如果有任何替代方法可以将日期和时间信息从C++传递到C#,反之亦然?

Dav*_*nan 5

传递给DateTime构造函数的值是a FILETIME,即从1601年1月1日开始的100纳秒间隔的数量.DateTime构造函数所期望的值是自0001年1月1日以来经过的100纳秒间隔的数量.因此1600年的差异.您可以通过简单地应用1600年的偏移来解决您的问题.