2015-05-20 57 views
0

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

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

由于提前

+0

i64听起来不错,也许你把它转换成服务器端不合适? – Hcorg

+0

字节是否正常?也许偶然的问题是endianess。 – luk32

+0

如何使用'volatile',因为它与时间有关。 –

回答

1

我认为康拉德的评论可能是准确的答案很简单,你需要确保的是,C++ I64的含义为C#I64相同。 .Net DateTime使用Windows滴答计数(自1601年起100纳秒的时间间隔)。您的C++代码可能预计自1970年以来。阅读...

跨平台日期/时间提出了几个挑战。有许多系统界面,独特的编程语言设施和各种编码日期/时间的方式。在大多数情况下,系统和语言不会尝试提供彼此的兼容性。

为了得到一个意义的可能性的范围:

  • 的GNU Linux支持timeval结构(微秒分辨率),结构的timespec(纳秒的分辨率),time_t的(第二分辨率),结构TM(日期/时间破down)等等,更多信息在这里:ftp://ftp.gnu.org/old-gnu/Manuals/glibc-2.2.3/html_chapter/libc_21.html
  • Windows使用SYSTEMTIME,FILETIME和LARGE_INTEGER作为高分辨率定时器。
  • C++ 98由C继承的时间(),但C++ 11提供了std ::时辰库
  • 的.Net提供的日期时间结构和其他功能

如果你要处理的日期并跨平台时,选择“数据透视格式”是一种有用的格式,这种格式在外部(例如,使用Apache Thrift)进行日期/时间通信时依赖于所有代码。

转换成数据透视格式(或任何其他特定格式)是您需要主动执行的操作。任何两个系统都提供兼容的结构和语义是不常见的。例如,POSIX和Windows都产生一个64位的整数,它包含了自纪元以来经过的时间,但粒度(时间单位)和时期(起始点)是不同的。 Windows GetSystemTimeAsFileTime()返回一个FILETIME,它自1601年1月1日午夜开始存储64位数的100纳秒间隔,POSIX time()函数返回自1970年1月1日以来已经过的秒数。还有一些系统定义了字段超过了他们的时钟粒度。 Windows GetSystemTime()将值报告为毫秒,但通常精确到只有大约10毫秒。添加到这个时区,闰秒和其他异常,如果您只是将一个结构中的位复制到另一个结构或者重新解释指针而没有仔细考虑源和目的地,那么您确实正在使用传单。

对于时间戳记样式数据的通用通信,显式结构通常比隐式流逝单位/时代整数值更清晰。例如,这样的事情可能工作为节俭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。

+0

正确的先生...它的工作..谢谢 –

相关问题