我有一个 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 以来的以秒为单位的偏移量。
我现在的问题是我没有办法create a ptime
使用 64 位整数的对象 -ticks
的一部分time_duration
对象是私有的,我只能使用long
在我的 32 位系统上,它只是一个 4 字节有符号整数,不足以存储距我的纪元的秒偏移量。
我无法控制纪元的价值,所以我真的很困惑如何创建我需要的boost::posix_time::ptime
我所拥有的数据中的对象。
我可能可以通过计算特定时间间隔的硬秒计数并使用额外的纪元来建立一个桥梁来实现这一点,从而获得一个肮脏的解决方案,但我想知道是否有一些东西在boost
代码将使我能够使用 boost datetime 库完全解决问题。
我已经阅读了我能找到的所有文档,但我看不到任何明显的方法来做到这一点。
编辑:我发现这个相关问题将 int64_t 转换为 time_duration但那里接受的答案不适用于我的时代
虽然boost::posix_time::seconds
cannot如果秒表示大于 32 位的数字(截至 2014 年 10 月),则使用,事实证明boost::posix_time::milliseconds
can易于使用(无需解决方法),如下所示:
inline std::string convertMsSinceEpochToString(std::int64_t const ms)
{
boost::posix_time::ptime time_epoch(boost::gregorian::date(1970, 1, 1));
boost::posix_time::ptime t = time_epoch + boost::posix_time::milliseconds(ms);
return boost::posix_time::to_simple_string(t);
}
因此,只需将 64 位秒转换为(64 位)毫秒,就可以了!
Note通过构建整型类型的能力,/非常/了解编译器相关的行为:
uint64_t offset = 113ul*365ul*24ul*60ul*60ul*1000ul; // 113 years give or take some leap seconds/days etc.?
可以在 GCC 或 Clang 上运行,但它只会溢出 MSVC2013 中的计算。您需要显式地将计算强制为 64 位:
uint64_t offset = uint64_t(113ul)*365*24*60*60*1000;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)