gpt4 book ai didi

c++ - 从 64 位整数秒数创建一个 boost::posix_time::ptime 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:53 27 4
gpt4 key购买 nike

我有一个 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 消息,我必须使用 RTC_SET_TIME 通过 ioctl 调用设置硬件和系统时钟>。这个 UINT32 又是 self 的纪元 1901-01-01 00:00:00 以来以秒为单位的偏移量。

我现在的问题是,我无法使用 64 位整数创建 ptime 对象 - ticks 部分>time_duration 对象是私有(private)的,我只能使用 long,它在我的 32 位系统上只是一个 4 字节有符号整数,不够大,无法存储与我的纪元的秒数​​偏移量。

我无法控制纪元的值,所以我真的很困惑如何根据我拥有的数据创建所需的 boost::posix_time::ptime 对象。我可能可以通过计算特定时间间隔的硬秒计数并使用额外的纪元来建立一个允许这样做的桥梁来获得一个肮脏的解决方案,但我想知道 boost 代码中是否有一些东西允许我完全使用 boost datetime 库解决了这个问题。我已经阅读了我能找到的所有文档,但我看不到任何明显的方法来做到这一点。

编辑:我发现了这个相关问题 Convert int64_t to time_duration但是那里接受的答案不适用于我的时代

最佳答案

尽管 boost::posix_time::seconds 不能 如果秒表示大于 32 位的数字(截至 2014 年 10 月),结果是 boost::posix_time::milliseconds 可以很容易使用(没有解决方法),如下所示:

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 位)毫秒,就可以开始了!


注意/非常/了解具有构建整数类型能力的编译器相关行为:

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;

关于c++ - 从 64 位整数秒数创建一个 boost::posix_time::ptime 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19379077/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com