4

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

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

  1. 填写 SYSTEMTIME 结构中的日期/时间(这不是当前系统时间。而是由程序根据某些条件填写)
  2. 将 SYSTEMTIME 转换为 FILETIME
  3. 将 FILETIME 转换为 __int64(这给出了一个 64 位值,表示从 1601 年 1 月 1 日开始的 100 纳秒间隔数)
  4. 在 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#,反之亦然?

4

1 回答 1

5

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

于 2013-08-27T13:51:33.200 回答