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