哪种数据类型最适合用于c++中thrift通信中的datetime
本文关键字:thrift 通信 datetime c++ 用于 数据类型 | 更新日期: 2023-09-27 17:50:07
在节俭的通信我需要发送日期和时间从客户端到服务器。那么哪种数据类型最合适呢?
我的客户端是在c++和服务器是在C- sharp。在服务器上,我使用DateTime关键字来完成这项任务。但是对我应该使用的Cpp感到困惑,因为我现在使用的I64在服务器端没有给我正确的数据。
Thanks in Advance
我认为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)。
转换到/从pivot格式(或任何其他特定格式)是你需要主动做的事情。对于任何两个系统来说,提供兼容的结构和语义是不常见的。
例如,POSIX和Windows都产生一个64位整数,其中包含自epoch以来经过的时间,但粒度(时间单位)和epoch(起点)不同。Windows GetSystemTimeAsFileTime()返回一个FILETIME,存储自1601年1月1日午夜以来的64位100纳秒间隔数,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++代码将可以访问相同的mscorlib。