我有一个 32 位 Linux 系统,在该系统中,我必须记录从 1901-01-01 00:00:00 开始的 UINT32 秒偏移量时间戳的数据。
计算时间戳对我来说没问题,因为我可以使用 64 位ticks()
计数器和ticks_per_second()
函数来生成自纪元以来的秒数,如下所示(我只需要二级分辨率)
const ptime ptime_origin(time_from_string("1901-01-01 00:00:00"));
time_duration my_utc = microsec_clock::universal_time() - ptime_origin;
boost::int64_t tick_per_sec = my_utc.ticks_per_second();
boost::int64_t tick_count = my_utc.ticks();
boost::int64_t sec_since_epoch = tick_count/tick_per_sec;
这对我有用,因为我知道作为无符号整数,秒数不会超过最大 UINT32 值(无论如何也不会超过很多年)。
我遇到的问题是我的应用程序可以接收包含 UINT32 值的 modbus 消息,我必须通过ioctl
调用来设置硬件和系统时钟RTC_SET_TIME
。这个 UINT32 再次是自我的时代 1901-01-01 00:00:00 以来的偏移量(以秒为单位)。
我现在的问题是我无法使用 64 位整数创建对象 - 对象的一部分是私有的,我被限制在我的 32 位系统上使用它只是一个 4 字节有符号整数,不足以存储从我的时代偏移的秒数。ptime
ticks
time_duration
long
我无法控制 epoch 的价值,所以我真的很难boost::posix_time::ptime
从我拥有的数据中创建我需要的对象。我可能可以通过计算特定时间间隔的硬秒计数并使用额外的时期来建立一个桥梁来获得一个肮脏的解决方案,但我想知道boost
代码中是否有一些东西可以让我完全使用提升日期时间库。我已经阅读了我能找到的所有文档,但我看不到任何明显的方法来做到这一点。
编辑:我发现了这个相关的问题Convert int64_t to time_duration但那里接受的答案不适用于我的时代