哪种数据类型最适合c ++中的thrift通信中的日期时间?

时间:2015-05-20 12:28:25

标签: c# c++ c communication thrift-protocol

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

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

先谢谢

1 个答案:

答案 0 :(得分:1)

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

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

了解各种可能性:

  • Gnu Linux支持struct timeval(usec resolution),struct timespec(nsec resolution),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日午夜以来的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 ++代码将可以访问与C#服务器相同的mscorlib.DateTime。