从 64 位整数秒计数创建 boost::posix_time::ptime 对象

2023-11-21

我有一个 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(使用前将#替换为@)

从 64 位整数秒计数创建 boost::posix_time::ptime 对象 的相关文章

随机推荐

  • UIAlertController - 将自定义视图添加到操作表

    当我们尝试附加屏幕截图中的图像时 我正在尝试制作如 iOS 上的消息应用程序中所示的操作表 我意识到在新的 UIAlertController 中 我们无法容纳任何自定义视图 我有什么办法可以做到这一点吗 我的代码看起来很标准 let al
  • Spark 中的 Hadoop DistributedCache 功能

    我正在寻找类似于Spark中Hadoop的分布式缓存的功能 我需要一个相对较小的数据文件 带有一些索引值 出现在所有节点中 以便进行一些计算 有什么方法可以在 Spark 中实现这一点吗 到目前为止 我的解决方法包括将索引文件作为正常处理进
  • 在 django admin 中创建新的自定义视图

    抱歉 我还是 django 新手 我想在管理站点上创建与我的模型无关的自定义视图 我已阅读文档 https docs djangoproject com en 2 0 ref contrib admin django contrib adm
  • 获取 numpy 数组中元素对的总和

    我有一个数组 t 4 5 0 7 1 6 8 3 2 9 这只是 0 9 范围内的随机洗牌 我需要计算这个 t2 9 5 7 8 7 14 11 5 11 13 这就是 t2 t 0 t 1 t 1 t 2 t 2 t 3 t 3 t 4
  • 使用 ios 使用 swift 进行本地通知 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我是 swift 的新手 我不知道如何实现本地通知 我尝试了一些代码 但它并不完全有效 所以任何人都可以帮助实现本地通知iOS using swift 在这里我分享一个例子 注册
  • 使用宏将项目附加到数组(C 语言)

    我有一个数组 C语言 应在编译时初始化 例如 DECLARE CMD f1 arg DECLARE CMD f2 arg DECLARE CMD 是从多个文件调用的 我希望对此进行预处理 my func type my funcs f1 f
  • 如何在不使用 的情况下制作带有闪烁光标和可编辑文本的 div?

    我需要制作一个 div 图层 这样当您单击它时 您的光标就会闪烁 您可以插入 删除文本 就像
  • 如何在 C# 中为 Windows-7 设置主显示器

    我相信我需要一个在 SetDisplayConfig 中执行此操作的示例 我的 Windows 7 系统有两个显示器 当我的程序处于一种模式时 第一台显示器必须打开并且是主要显示器 第二台显示器必须关闭 在其他模式下 反之亦然 第一个显示器
  • 如何列出目录中的所有文件?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 如何在Python中列出目录中的所有文件并将它们添加到list os listdir 返回目录中的所有内容 包括两者files and 目录 os path s
  • 使用JQ替换JSON中的下划线

    我正在与吴商务用于检索和存储信息的 API 目前我们的设置设计为使用驼峰式大小写而不是下划线 我在用着jq处理我们的信息 但我很好奇如何使用sub regex tostring 函数用驼峰命名法替换 JSON 中的下划线 这是代码示例 li
  • Xamarin Studio 2 - 最新稳定更新 - 执行任务 Aapt 时出错:源序列为空

    我正在使用 Xamarin Studio 的试用版来完成我的最后一年项目 其中包含一个 Android 应用程序 最初一切都很顺利 但今天在更新到最新的稳定版本后 我遇到了一个错误 如本文标题所述 构建日志如下 构建解决方案 MyActiv
  • 让 tmux windows 继承`activate`d anaconda 环境

    为了方便起见 并考虑到activate 环境非常慢 我想激活一个环境 然后启动一个tmux会议 我想要全新的tmuxwindows 也可以激活环境 我想要不同的tmux会话能够支持不同的 anaconda 环境 我该怎么办 是否存在任何不支
  • 比 double 更精确的浮点数据类型?

    在我的项目中 我必须在矩阵上计算除法 乘法 减法 加法double元素 问题是 当矩阵的大小增加时 我的输出的准确性会受到极大影响 目前我正在使用double对于我认为使用的每个元素8 bytes的记忆力和准确度16 digits与小数点位
  • Selenium 如何点击 50% 在屏幕上和 50% 不在屏幕上的元素?

    有一个 div 元素 其大小的 50 在屏幕上 另外 50 超出屏幕高度并且不可见 无法滚动 我尝试使用 Selenium 进行自动化测试并单击该 div 元素 但有时它有效 有时则无效 为什么 Selenium 不直接点击该 div 的
  • NHIbernate OR 标准查询

    我有以下映射类 Trade ID AccountFrom AccountTo Account ID Company Company ID 现在我无法找到一种方法来选择所有交易 AccountFrom Company ID X OR Acco
  • 我应该使用 django-gunicorn 集成还是 wsgi?

    我正在使用gunicorn django 设置一个网络服务器 有两种部署选项 使用常规 WSGI 或使用gunicorn 的 django 集成 我很想使用后者 因为它简化了配置 但是Django 文档说 If you are using
  • PhoneGap Eclipse 问题 - eglCodecCommon glUtilsParamSize:未知参数错误

    我刚刚开始使用phonegap 并尝试在eclipse 中设置第一个基本的最小项目 我按照以下位置的phonegap文档进行操作http docs phonegap com en edge guide platforms android i
  • MySQL InnoDB 不同数据库之间的外键

    我想知道在 InnoDB 中是否可以MySQL有一个table with 外键引用不同的另一个表database 如果是这样 如何做到这一点 我没有看到任何限制https dev mysql com doc refman 8 0 en cr
  • Django-Celery 正在生产中吗?

    所以我一直在试图弄清楚如何制定计划任务 我找到了 Celery 并且能够制定简单的计划任务 为此 我需要打开命令行并运行celery A proj beat为了任务的发生 这在开发环境中工作得很好 但是当将其投入生产时 这将是一个问题 那么
  • 从 64 位整数秒计数创建 boost::posix_time::ptime 对象

    我有一个 32 位 Linux 系统 在其中我必须记录时间戳为距 1901 01 01 00 00 00 的 UINT32 秒偏移量的数据 计算时间戳对我来说没问题 因为我可以使用 64 位ticks 计数器和ticks per secon