哪种数据类型最适合 c++ 中节俭通信中的日期时间?
Posted
技术标签:
【中文标题】哪种数据类型最适合 c++ 中节俭通信中的日期时间?【英文标题】:Which Data Type is most appropriate for datetime in thrift communication in c++? 【发布时间】:2015-05-20 12:28:25 【问题描述】:在节俭通信中,我需要将日期和时间从客户端发送到服务器。所以哪种数据类型最合适。
我的客户端使用 C++,而服务器使用 C-Sharp。在服务器中,我使用 DateTime 关键字来执行此任务。但是对 Cpp 我应该使用什么感到困惑,因为我现在使用的 I64 没有在服务器端给我正确的数据。
提前致谢
【问题讨论】:
i64 听起来不错,也许你在服务器端转换不正确? 字节是否有序?也许碰巧问题出在字节序上。 使用volatile
怎么样,因为它与时间有关。
Konrad 我在服务器端使用 DateTime。并且日期时间内部是一个结构,所以我应该选择结构,但在这种情况下,我必须为日期和时间编写一个新结构并一个一个地填充它。
是的 luk 字节是有序的。首先,深入了解节俭有点困难,但我在客户端拥有的数组我也在服务器端获得。
【参考方案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。
【讨论】:
以上是关于哪种数据类型最适合 c++ 中节俭通信中的日期时间?的主要内容,如果未能解决你的问题,请参考以下文章