c++ - 序列化日期时间

标签 c++ time c++11

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

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

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

最佳答案

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

  • 您需要亚秒级精度吗?显然,POSIX time_t 通常不提供这一点,除非您使用某种浮点类型(这可能会引入其自身的问题)。其他语言和库的时间格式(例如 JavaScript 和 Java)使用自固定日期以来的毫秒数而不是自固定纪元以来的秒数来解决此问题。
  • 如果要跨时区存储和检索时间戳,则使用定义为相对于纪元的格式(例如 POSIX time_tJavaScript Data )可能比存储本地时间更好时区。
  • 如果您需要知道原始时区,那么您还需要存储它。
  • 因为 year 2038 problem ,如果您使用 POSIX time_t 之类的东西,您将需要将其存储为 64 位数字,而不是 32 位数字。 (即使您将其存储为 64 位数字,请记住您的 C 运行时的 mktimelocaltime 实现可能不支持 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 年成为问题之前得到更新。

关于c++ - 序列化日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12096071/

相关文章:

c++ - 在 C++ 中对数字数组进行排序时,是否必须将字符串转换为 double ?

ios - 跟踪应用程序的运行时间 iOS

c++ - 初始化后更改变量引用

c++ - 自动实现依赖姐妹类的虚函数

c++11 - 如何将前 N 个参数传递给 C++ 函数

C++:牛顿拉夫森和重载函数

c# - DLLImport 找不到 dll

grails - 如何在grasp gsp中使用g:datePicker来选择时间?

c++ - 在没有日志文件的情况下,sqlite3 在线备份在正在运行的事务中是否有效

PHP 等效于 javascript Math.random()