c++如何获取当前系统时间_c++ chrono库高精度时间戳获取【方法】

发布时间 - 2025-12-26 00:00:00    点击率:
最常用方式是用std::chrono::system_clock::now()获取时间点,再通过to_time_t转为time_t输出可读时间;该时间受系统调整影响,不适用于间隔测量。

std::chrono::system_clock 获取当前系统时间(秒级)

最常用、最直接的方式是通过 std::chrono::system_clock 获取自纪元(1970-01-01 00:00:00 UTC)以来的时间点,再转成 time_t 格式输出可读时间。

注意:它返回的是系统时钟时间,受系统时间调整(如 NTP 同步、手动修改)影响,不适用于测量间隔。

auto now = std::chrono::system_clock::now();
auto time_t = std::chrono::system_clock::to_time_t(now);
std::cout << std::put_time(std::localtime(&time_t), "%Y-%m-%d %H:%M:%S") << std::endl;
  • std::chrono::system_clock::now() 返回 time_point,精度取决于平台(Linux 通常纳秒,Windows 通常 15.6ms)
  • std::put_time 需要
  • std::localtime 不是线程安全的;多线程中建议用 std::localtime_r(POSIX)或 _localtime64_s(MSVC)

std::chrono::steady_clock 获取高精度单调时间戳(推荐测时)

如果你真正需要“高精度”且“不受系统时间跳变影响”的时间戳(比如性能计时、超时控制),std::chrono::steady_clock 才是正确选择。

它从某个未指定起点开始单调递增,精度通常优于 system_clock,且不会因时钟校正而倒退或突变。

auto start = std::chrono::steady_clock::now();
// ... do something ...
auto end = std::chrono::steady_clock::now();
auto duration_ms = std::chrono::duration_cast(end - start).count();
  • 差值运算(end - start)返回 duration 类型,必须显式转换才能获取整数值
  • std::chrono::nanosecondsmicrosecondsmilliseconds 等都是合法的 duration_cast 目标类型
  • 不要把 steady_clock::time_point 转成 time_t —— 它没有纪元定义,转换无意义

跨平台纳秒级时间戳:用 std::chrono::high_resolution_clock 要小心

std::chrono::high_resolution_clock 在 C++11 中是个“别名”,实际类型由标准库实现决定:GCC/Clang 下常映射为 steady_clock,MSVC 下早期版本可能映射为 system_clock

这意味着它**不保证单调性,也不保证高精度**——名字有误导性,不建议依赖。

  • C++20 起已标记为 deprecated,应避免使用
  • 想高精度 + 单调 → 用 steady_clock
  • 想高精度 + 可读时间 → 用 system_clock,再配合 file_clock(C++20)或第三方库(如 date.h)做时区/格式化
  • 若需纳秒级原始整数(如日志打点),可直接取 time_since_epoch().count()
auto ns = std::chrono::steady_clock::now().time_since_epoch().count(); // 返回纳秒数(类型通常是 long long)

常见错误:混用 clock 类型或忽略精度截断

下面这些写法看着合理,实则埋坑:

  • steady_clock::now() 调用 to_time_t() → 编译失败,该函数只对 system_clock 定义
  • auto t = system_clock::now().time_since_epoch().count() 当作“纳秒时间戳”用于排序 → 错!system_clock 在 Windows 上底层是 GetSystemTimeAsFileTime,分辨率约 100ns,但 count() 返回的是 100ns 单位,不是纳秒
  • 在循环里反复调用 system_clock::now() 并格式化 → 性能差,std::put_time + localtime 开销不小,高频打点应先存 time_point,最后批量格式化

真正需要高精度、跨平台、带时区的系统时间,std::chrono 原生能力有限,得靠 Howard Hinnant’s date library 或 C++20 的 扩展。基础场景下,分清 system_clock(挂钟)和 steady_clock(计时器)就够了。


# c++  # count  # date  # auto  # 循环  # 线程  # 多线程  # windows  # linux  # 的是  # 转成  # 最常用  # 都是  # 不适用于  # 看着  # 是个  # 如果你  # 也不  # 才是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速搭建二级域名独立网站?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  公司门户网站制作流程,华为官网怎么做?  动图在线制作网站有哪些,滑动动图图集怎么做?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  IOS倒计时设置UIButton标题title的抖动问题  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  5种Android数据存储方式汇总  JavaScript如何操作视频_媒体API怎么控制播放  手机网站制作与建设方案,手机网站如何建设?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Laravel如何使用withoutEvents方法临时禁用模型事件  JS实现鼠标移上去显示图片或微信二维码  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  如何在服务器上配置二级域名建站?  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  EditPlus中的正则表达式 实战(2)  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何在万网自助建站中设置域名及备案?  Laravel如何自定义错误页面(404, 500)?(代码示例)  简单实现Android文件上传  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  长沙企业网站制作哪家好,长沙水业集团官方网站?  java获取注册ip实例  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何在IIS中配置站点IP、端口及主机头?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何获取上海专业网站定制建站电话?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  如何在万网主机上快速搭建网站?  怎么用AI帮你为初创公司进行市场定位分析?  晋江文学城电脑版官网 晋江文学城网页版直接进入  敲碗10年!Mac系列传将迎来「触控与联网」双革新  android nfc常用标签读取总结  Firefox Developer Edition开发者版本入口  Python文件异常处理策略_健壮性说明【指导】