Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 序列化日期时间_C++_Time_C++11 - Fatal编程技术网

C++ 序列化日期时间

C++ 序列化日期时间,c++,time,c++11,C++,Time,C++11,执行日期/时间对二进制序列化的最佳方法是什么 到目前为止,我最好的猜测是存储POSIX time()和mktime()函数返回的自纪元以来的秒数,然后在检索时使用localtime()将其转换回“人类可读”的结构 请注意,时间戳将由不同时区的计算机存储和检索 请注意,时间戳将由不同时区的计算机存储和检索 你也需要存储时区吗?您是对存储它的本地日期和时间感兴趣,还是只对瞬间感兴趣 基本上,找出哪些信息对你来说是重要的,并确保你存储了这些信息。你已经回答了自己的问题。根据当地人的情况(如昼时、时区、

执行日期/时间对二进制序列化的最佳方法是什么

到目前为止,我最好的猜测是存储POSIX time()和mktime()函数返回的自纪元以来的秒数,然后在检索时使用localtime()将其转换回“人类可读”的结构

请注意,时间戳将由不同时区的计算机存储和检索

请注意,时间戳将由不同时区的计算机存储和检索

你也需要存储时区吗?您是对存储它的本地日期和时间感兴趣,还是只对瞬间感兴趣


基本上,找出哪些信息对你来说是重要的,并确保你存储了这些信息。

你已经回答了自己的问题。根据当地人的情况(如昼时、时区、24小时等),根据需要将计算机可理解的时间值转换为人类可读的格式是最好的。它的存储空间也很小。

这取决于您对哪些数据感兴趣:

  • 你需要亚秒精度吗?显然,POSIX
    time\u t
    通常不提供这一功能,除非您使用某种浮点类型(这可能会带来自身的问题)。其他语言和库的时间格式(如JavaScript和Java)使用毫秒自固定日期而不是秒自固定纪元来解决这个问题
  • 如果跨时区存储和检索时间戳,那么使用定义为相对于历元的格式(如POSIX
    time\t
    或a)可能比存储本地时间+时区要好
  • 如果您需要知道原始时区,那么您也需要存储它
  • 因为,如果您使用POSIX
    time\t
    之类的东西,您将希望将其存储为64位数字,而不是32位数字。(即使将其存储为64位数字,也要记住,C运行时的
    mktime
    localtime
    实现可能不支持64位
    time
    值。)

特别是关于2038年的问题:我不知道有哪种POSIXAPI能够保证处理这个问题。如果您想要一个保证能够处理它的库,那么最好使用类似于
boost::date\u time
的东西。包含有关测试2038支持的C运行时的信息。根据该页面,现代64位Linux系统不应受到影响。VisualC++的最新版本也不会受到影响。(.)即使您的库当前不支持64位
time\t
值,您也可以序列化64位int并将其强制转换为32位来处理它;这样,您的磁盘数据结构将至少符合要求,并且您的库有望在2038年成为问题之前更新。

这取决于您希望如何与二进制类型接口。如果总是使用POSIX函数,那么当然,时间值也可以。在Windows上,您需要将其转换为他们的格式,以获得日期。始终将二进制值保存为UTC。当然,不要对此原始值应用任何偏移

另一种方法(不是最快的)是存储字符串,而不是绑定到任何一个函数库。当然,如果您确实知道1345739726的二进制值是使用POSIX调用创建的,那么如果您将该值移动到Windows系统,就可以进行转换。字符串格式只是消除了关于表示时间点的任何问题。
String Stime=“年:月:星期一:工作日:小时:秒:白天:GMTOffice”< /P> C还是C++?它们是不同的语言,我会在每种语言中使用不同的方法。您可以将boost::date\u time与`boost::serialization
结合使用。或者,如果您不想使用Boost,C++11标准库提供了一个
chrono`header,它定义了一个可以轻松序列化的
std::chrono::duration
std::chrono::timepoint
。不,存储日期时间的时区并不重要,因为时区是用户定义的设置。在这里,真正的、通用的、瞬间才是最重要的。@cyberguijarro:对,在这种情况下,“unix时代以来的秒数”是完全合理的(假设这是您首先获得数据的精度)。请确保您非常明确地记录它:)不,我不需要亚秒精度,但2038年是我想妥善处理的事情。。。我有什么选择?64位系统上的时间是64位长,还是有其他POSIX API来处理这个问题?@cyberguijarro-我在2038年添加了一些细节。