执行日期/时间对的二进制序列化的最佳方法是什么?
到目前为止,我最好的猜测是存储自纪元以来的秒数,由POSIX time()和mktime()函数返回,然后在检索时使用localtime()将其转换回“人类可读”结构
请注意,时间戳将由计算机在各个时区存储和检索。
答案 0 :(得分:4)
这取决于你感兴趣的确切数据:
time_t
通常不会提供,除非您使用某种浮点类型(可能会引入自己的问题)。其他语言和库的时间格式(例如JavaScript和Java)使用毫秒 - 自定义日期而不是秒 - 自定义时代来解决此问题。time_t
或JavaScript Data)可能比存储本地时间+ a更好时区。time_t
的内容,则需要将其存储为64位数字,而不是32位数字。 (即使将其存储为64位数字,请记住,C运行时的mktime
和localtime
实现可能不支持64位time_t
值。)特别是关于2038年的问题:我不知道任何保证处理它的POSIX API。如果您想要一个可以保证处理它的库,那么最好使用boost::date_time
之类的东西。 Project 2038 FAQ包含有关测试C运行时以获得2038支持的信息。根据该页面,现代64位Linux系统不应受到影响。最新版本的Visual C ++也不受影响。 (See here。)即使您的库当前不支持64位time_t
值,您也可以序列化64位int并将其转换为32位来处理它;这样你的磁盘上的数据结构至少是合规的,你的库有望在2038年成为问题之前更新。
答案 1 :(得分:1)
请注意,时间戳将由计算机在各个时区存储和检索。
您是否还需要存储该时区?您是否对存储时的本地日期和时间感兴趣,或者只是及时即时?
基本上,找出对您来说重要的信息,并确保存储该信息。
答案 2 :(得分:0)
你已经回答了自己。计算机可理解的时间值,根据当地人的情况(即白天时间,时区,24小时等),根据需要转换为人类可读的格式是最好的。它也很小。
答案 3 :(得分:0)
这取决于您希望如何与二进制类型进行交互。如果总是使用POSIX函数然后确定,time_t值就可以了。在Windows上,您需要将其转换为其格式以获取日期。当然,始终将二进制值保存为UTC,不要对此原始值应用任何偏移量。
另一种方式(不是最快的)是存储字符串而不是绑定到任何一个函数库。当然,如果您确定使用POSIX调用创建了二进制值1345739726,则可以在将该值移动到Windows系统时进行转换。字符串格式只是删除了表示什么时间点的任何问题。 string sTime =“Year:Month:MonthDay:WeekDay:Hour:Mintue:Second:Daylight:GMTOffset”