哪种数据类型最适合 C++ 中节俭通信中的日期时间?

Which Data Type is most appropriate for datetime in thrift communication in c++?

在节俭通信中,我需要从客户端向服务器发送日期和时间。所以哪种数据类型最合适。

我的客户端使用 C++,服务器使用 C-Sharp。在服务器中,我使用 DateTime 关键字来完成这项任务。但对 Cpp 感到困惑,我应该使用什么,因为我现在使用的 I64 没有在服务器端给我正确的数据。

提前致谢

我认为 Konrad 的评论可能是准确的简短答案,您需要确保 C++ i64 与 C# i64 具有相同的含义。 .Net DateTime 使用 Windows 滴答计数(自 1601 年以来 100 纳秒间隔)。自 1970 年以来,您的 C++ 代码可能需要几秒钟。继续阅读...

跨平台 Date/Time 提出了几个挑战。有许多系统接口、不同的编程语言设施和各种编码方式 date/time。在大多数情况下,系统和语言不会尝试提供彼此的兼容性。

了解可能性的范围:

  • Gnu Linux 支持 struct timeval(usec 分辨率)、struct timespec(nsec 分辨率)、time_t(第二分辨率)、struct tm(date/time 分解)等,更多信息在这里:ftp://ftp.gnu.org/old-gnu/Manuals/glibc-2.2.3/html_chapter/libc_21.html
  • Windows 使用 SYSTEMTIME、FILETIME 和 LARGE_INTEGER 作为高分辨率计时器。
  • C++98 从 C 继承了 time() 但 C++11 提供了 std::chrono 库
  • .Net 提供 DateTime 结构和其他功能

如果您想跨平台处理日期和时间,select 一种“数据透视格式”可能会有所帮助,这种格式是您的所有代码在与 date/time 外部通信时所依赖的格式(例如,使用 Apache Thrift)。

转换 to/from 数据透视格式(或任何其他特定格式)是您需要主动做的事情。任何两个系统都提供兼容的结构和语义是不常见的。

例如,POSIX 和 Windows 都生成一个 64 位整数,其中包含自纪元以来经过的时间,但粒度(时间单位)和纪元(起点)不同。 Windows GetSystemTimeAsFileTime() returns 一个 FILETIME 存储自 1601 年 1 月 1 日午夜以来 100 纳秒间隔的 64 位数字和 POSIX time() 函数 returns 数字自 1970 年 1 月 1 日以来经过的秒数。此外,某些系统定义的字段超出其时钟粒度。 Windows GetSystemTime() 报告的值精确到毫秒,但通常只精确到大约 10 毫秒。再加上时区、闰秒和其他异常情况,如果您只是将位从一个结构复制到另一个结构或重新解释指针而不仔细考虑源和目标,那么您真的是在传单。

对于时间戳样式数据的通用通信,显式结构通常比隐式 elapsed-unit/epoch 整数值更清晰。例如,类似这样的东西可能适用于 Thrift RPC 应用程序:

struct TimeStamp {
  1: i16 year
  2: byte month
  3: byte day
  4: byte hour=0
  5: byte minute=0
  6: i16 second=0
  7: double fraction=0
}

如果您希望能够使用您的时间戳进行数学计算(例如,减去两个时间戳以找到经过的时间),那么整数值(如 i64)可能会更好,但您仍然需要建立一个数据透视格式和仔细管理从平台到平台以及从语言到语言的转换,以至少解决粒度和时代问题。

JVM 和 .Net/CLR 环境的一个好处是您可以使用平台上任何语言的相应平台库。因此,如果您使用托管 C++,您的 C++ 代码将可以访问与 C# 服务器相同的 mscorlib.DateTime。