0

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

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

提前致谢

4

1 回答 1

1

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

跨平台日期/时间提出了几个挑战。有许多系统接口、不同的编程语言工具和各种编码日期/时间的方法。在大多数情况下,系统和语言不会尝试提供彼此的兼容性。

要了解可能性的范围:

  • Gnu Linux 支持 struct timeval(usec 分辨率)、struct timespec(nsec 分辨率)、time_t(秒分辨率)、struct tm(分解的日期/时间)等,更多信息请参见: 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 结构和其他功能

如果您想跨平台处理日期和时间,选择“数据透视格式”会很有好处,这是您的所有代码在与外部通信日期/时间时所依赖的格式(例如,使用 Apache Thrift)。

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

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

对于时间戳样式数据的通用通信,显式结构通常比隐式经过单位/历元积分值更清晰。例如,这样的事情可能适用于 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。

于 2015-05-21T19:52:34.777 回答