拥抱c++ chrono 抛弃 c time

C++日期时间处理全解析:从chrono库到C++20新特性 在软件开发中,日期时间处理是基础且关键的技术环节,涉及时间点、时长、时区等核心概念。其原理基于计算机内部的时间表示(如Unix时间戳)和日历算法,确保时间计算的准确性和一致性。这项技术的价值在于为应用程序提供可靠的时间基准,支撑日志记录、任务调度、数据同步等多种功能。在实际应用场景中,开发者常需处理时间戳转换、日期比较、时区适配等高频需求,尤其在跨地域服务和分布式系统中更为重要。本文聚焦C++语言,深入探讨其标准库中日期时间处理的演进与最佳实践,涵盖从传统C风格函数到现代chrono库的完整方案,并解析C+ 阅读详情
  1. 获取当前UNIX时间戳(timestamp)

UNIX时间戳(timestamp):是以GMT/UTC时间「1970-01-01T00:00:00」为起点,到当前具体时间的秒数(不考虑闰秒)

    auto now_point = std::chrono::system_clock::now();

    auto new_point_s = std::chrono::time_point_cast<std::chrono::seconds>(now_point);
    std::cout << "UTC seconds     : " << new_point_s.time_since_epoch().count() << std::endl;

    auto new_point_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now_point);
    std::cout << "UTC microseconds: " << new_point_ms.time_since_epoch().count() << std::endl;

    auto new_point_us = std::chrono::time_point_cast<std::chrono::microseconds>(now_point);
    std::cout << "UTC microseconds: " << new_point_us.time_since_epoch().count() << std::endl;

    auto new_point_ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(now_point);
    std::cout << "UTC microseconds: " << new_point_ns.time_since_epoch().count() << std::endl;

说明:

C++标准定义了3个时钟(clock)类,分别是system_clock、steady_clock、high_resolution_clock。
system_clock:来自系统实时时钟的真实时间
steady_clock:能保证其时点(time_point)绝对不会递减的时钟。而system_clock无法保证,因为系统时间可以随时调整
high_resolution_clock:这个时钟的嘀嗒周期达到了最小值,high_resolution_clock可能是system_clock或者steady_clock的别名,具体取决于编译器。

2、格式化输出

(1)C++风格 std::put_time (头文件<iomanip>)

auto now_point = std::chrono::system_clock::now();
std::time_t ttm = std::chrono::system_clock::to_time_t(now_point);
std::stringstream ss;
ss << std::put_time(localtime(&ttm), "%Y-%m-%d %H:%M:%S");
std::cout << ss.str() << std::endl;

(2)C风格strftime (头文件<ctime>)

std::time_t ttmm= std::chrono::system_clock::to_time_t(now_point);
struct tm  *timeinfo = std::localtime(&ttmm);
char buf[24] = {0};
std::strftime(buf, 24, "%Y-%m-%d %H:%M:%S", timeinfo);
std::cout << buf << std::endl;

3、格式化输入

(1)C++风格 std::get_time(头文件<iomanip>)

std::string time_str = "20230322171019";
std::istringstream ss(time_str);
struct tm time_struct;
ss >> std::get_time(&time_struct, "%Y%m%d%H%M%S");
time_t t_time = mktime(&time_struct);
auto time_point = std::chrono::system_clock::from_time_t(t_time);

(2)C风格strptime (头文件<ctime> or <time.h>)

std::string time_str = "20230322171019";
strptime(time_str.c_str(), "%Y%m%d%H%M%S", &time_struct);
time_t t_time = mktime(&time_struct);
auto time_point = std::chrono::system_clock::from_time_t(t_time);

4、时间戳差(计算耗时性能)

auto start = std::chrono::steady_clock::now();
sleep(1);
auto end = std::chrono::steady_clock::now();

auto diff = end - start;
std::cout << std::chrono::duration<double>(diff).count() << "s" << std::endl;
std::cout << std::chrono::duration<double, std::milli>(diff).count() << "ms" << std::endl;
std::cout << std::chrono::duration<double, std::micro>(diff).count() << "us" << std::endl;
std::cout << std::chrono::duration<double, std::nano>(diff).count() << "ns" << std::endl;
别再傻傻用time()了!C++11 chrono库的system_clock才是现代C++时间处理的正确姿势 本文深入探讨了C++11 chrono库中system_clock的现代时间处理方式,对比传统time()函数的局限性,展示了其类型安全、高精度和线程安全等优势。通过实战示例解析了time_point与duration的核心概念,并提供了与C风格时间互操作、性能优化及跨平台开发的最佳实践,帮助开发者高效处理时间相关任务。 阅读详情

相关推荐

现代C++日期时间库:从类型安全到全球时区处理

在软件开发中,日期时间处理是基础且关键的环节,尤其在涉及跨时区业务、定时任务和数据分析时。传统C/C++的时间函数如time_t和struct tm存在类型不安全、线程不安全及难以处理时区等痛点。现代C++标准库通过<chrono>提供了类型安全的时长(duration)和时间点(time_point)抽象,利用编译期检查杜绝单位混淆错误。其核心价值在于提升代码的健壮性和可维护性,广泛应用于金融交易、全球调度和日志系统等场景。C++20进一步引入了日历日期类型和完整的时区支持,基于IANA数据库,能优雅处理

mxdxm8899的专栏 453

std::get_time和std::put_time

在 C++ 中,std::get_time 和 std::put_time 是处理日期和时间格式化的两个实用函数。它们提供了一种简单的方法来解析和格式化日期时间字符串。它们都属于 头文件。它们是 std::istream 和 std::ostream 的操作符,因此,它们没有传统意义上的构造函数。它们用于格式化和解析日期时间,但本身并不涉及直接创建对象。

m0_60697583的博客 1522

C++机器人开发:yaml-cpp配置文件实战与ROS参数管理

在软件工程中,配置文件是实现参数化设计、提升系统可维护性的核心机制。其原理是将易变的运行参数从固定的程序逻辑中解耦,通过外部文件进行管理,从而实现无需重新编译即可调整程序行为的技术价值。这一设计在机器人开发领域尤为重要,因为机器人系统通常涉及大量需要现场调试的参数,如PID控制系数、传感器标定数据和导航算法阈值。通过采用人类可读性强的YAML格式,结合成熟的C++解析库yaml-cpp,开发者可以构建出支持动态重载、分层管理的健壮配置系统。本文以机器人开发为应用场景,深入探讨了如何利用yaml-cpp进行高

weixin_34289454的博客 410

c++11把时间转换为字符串方法大全

C++11格式化时间的方法非常方便,主要使用了std::put_time的方式来进行格式化: 定义于头文件<iomanip> template<classCharT> /*unspecified*/put_time(conststd::tm*tmb,constCharT*fmt); 具体的格式化时间的代码如下: auto time=std::chrono::system_clock::t...

哦,原来你也在这里。 3035

C++时间格式化进阶:你不知道的strftime隐藏用法与性能对比

本文深入探讨C++中时间格式化的进阶技巧,重点解析strftime函数的隐藏用法,包括本地化输出、ISO周数计算等冷门格式符,并对比其与C++20 chrono库在跨平台兼容性及性能上的差异。通过基准测试数据,为开发者在不同场景下选择高效、安全的时间处理方案提供实用指南。

weixin_29016833的博客 113

VS2022 C++工具链核心改进与迁移实战指南

C++编译器与集成开发环境(IDE)是软件开发的基石,其性能与标准支持直接影响项目的构建效率与代码质量。现代C++开发中,编译速度、调试体验和对新语言特性的支持是关键痛点。Visual Studio 2022的C++工具链进行了深度重构,通过优化MSVC编译器前端、引入全新增量链接引擎,显著提升了大型项目的编译与链接性能。同时,它全面拥抱C++20/23标准,稳定支持模块(module)、概念(concept)、协程(coroutine)和范围库(<ranges>)等现代特性,使开发者能编写更安全、高效的代

weixin_34296641的博客 411

C++11新特性——时间操作chrono库

C++11

m0_67168421的博客 2434

C++ string核心原理与高效编程实战:从内存模型到SSO优化

在C++编程中,字符串处理是基础且高频的操作。传统C风格字符串(char*)需要手动管理内存和空字符,易引发缓冲区溢出和内存泄漏。C++标准库提供的std::string通过封装底层字符数组,实现了自动内存管理和动态扩容,其原理类似于动态数组(如vector),但针对字符串操作进行了专门优化。这一设计体现了C++的“资源管理”和“零开销抽象”哲学,在保证安全性的同时追求运行效率。在实际工程中,理解string的内存模型(包括容量capacity与大小size)、小字符串优化(SSO)机制以及迭代器失效规则至

weixin_30315723的博客 316

为什么选择Real-Time C++?10个理由让你爱上嵌入式实时编程

在嵌入式系统开发的世界里,实时C++编程正在成为一项关键技能。如果你还在犹豫是否要深入学习嵌入式实时编程,那么这篇文章将为你揭示**Real-Time C++**的10个强大优势,让你爱上这个令人兴奋的技术领域!🚀 ## 1. 极致性能优化:让代码飞起来 ✨ **Real-Time C++** 的核心优势在于其无与伦比的性能优化能力。通过直接内存访问和硬件寄存器操作,你可以编写出接近汇编效率

gitblog_00978的博客 339

C++程序员如何通过阅读Redis源码提升编程内功与工程能力

在软件工程领域,深入理解底层原理是提升代码质量的关键。从计算机科学基础概念切入,数据结构与算法、内存管理、并发模型是构建高性能系统的核心支柱。其技术价值在于,掌握这些原理能帮助开发者编写出更高效、健壮和可维护的代码,尤其在资源敏感和高并发场景下。通过剖析工业级开源项目如Redis,可以直观学习这些理论如何落地为精良的工程实践。Redis作为高性能键值存储的典范,其源码在数据结构设计(如SDS动态字符串)、内存管理封装和单线程事件驱动模型等方面提供了绝佳范本。本文聚焦于如何借鉴Redis源码中的设计思想,例如

weixin_34245082的博客 382

深入解析C++中的std::put_time函数:时间格式化的利器

C++11的std::put_time函数是处理时间格式化的强大工具。该函数位于<iomanip>头文件中,支持丰富的格式化指令,能够将时间按照自定义格式输出。std::put_time的基本用法包括获取当前时间、指定格式字符串输出时间,并支持与字符串流结合使用。其格式化指令涵盖年、月、日、时、分、秒等多种时间元素,还支持本地化设置和多语言环境。高级用法包括与std::locale结合实现多语言支持、性能优化技巧以及在实际应用中的使用场景,如日志系统、文件备份等。最佳实践建议重用tm结构、缓存格

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 139

边用llama.cpp边学C++:Windows 11下真实工程驱动的入门路径

C++是一门强工程导向的语言,其核心价值在于对内存、硬件和系统资源的直接掌控。理解std::vector的RAII语义、std::thread的生命周期管理、CUDA与CPU协同的构建逻辑,远比孤立记忆语法更重要。llama.cpp作为轻量级但工业级的大模型推理引擎,天然融合了现代C++关键特性(如constexpr、模板元编程、跨平台条件编译)与底层实践(mmap内存映射、AVX指令对齐、OpenMP并发优化),成为连接语法知识与真实系统行为的理想桥梁。尤其在Windows 11 + CUDA环境下,从编

weixin_33700350的博客 407

C++高精度计时器实现:毫秒到纳秒

本文还有配套的精品资源,点击获取 简介:在性能测试和实时系统中,C++编程经常需要开发高精度的计时器。本教程将介绍如何使用C++标准库中的 <chrono> 头文件创建毫秒、微秒和纳秒级别的计时器。这涉及到使用 std::chrono::duration 来表示不同单位的时间间隔,以及 std::chrono::high_re...

weixin_35578748的博客 3351

C++11核心特性解析:从类型推导到智能指针的现代化编程实践

在C++编程语言的发展历程中,类型推导和内存管理是两个基础且关键的技术概念。类型推导允许编译器自动推断变量类型,减少冗余代码并提升开发效率,其原理基于编译期的模板参数推导规则。这一技术价值在于增强代码的简洁性和可维护性,同时保持零运行时开销。内存管理则通过RAII(资源获取即初始化)机制确保资源的自动释放,避免内存泄漏和悬垂指针问题。在应用场景上,这些技术广泛应用于系统编程、高性能计算和大型软件项目中,显著提升代码的健壮性和性能。本文聚焦于C++11标准引入的现代化特性,深入探讨了auto关键字、右值引用、

diaohuyi6830的博客 395

MAC 青花瓷(Charles)爪机HTTPS 抓包

前段时间跟之前的产品小姐姐聊天,小姐姐说开发让她抓包帮忙看下数据,然而自己又不会,那就来写一篇简易版的教程 冲冲冲! 手上只有mac电脑跟iPhone手机,只做苹果手机的抓包,android7.0以上版本也没法通过正常的抓htts的包,让安卓开发装个后门吧,不是安卓开发并不知道是啥,连上USB之后访问chrome://inspect/#devices就能很简单的抓包 一、准备工具等 青花瓷...

Promise的博客 1615

AI提示词实战:用EARS语法5步搞定产品需求拆解(附完整案例)

本文详细介绍了如何运用EARS语法将模糊的产品需求进行原子化拆解,转化为清晰、可执行的结构化指令。通过一个完整的自由职业者项目管理工具案例,演示了从原始需求分析到构建增强AI提示词的五步实战流程,帮助产品经理和技术人员实现高效、精准的需求传达与协作。

nokia的博客 1033

C/C++随机数生成:从rand()到现代库的全面指南与最佳实践

随机数生成是计算机科学中的基础概念,其核心原理是通过确定性算法(伪随机)或物理熵源(真随机)产生不可预测的数值序列。在编程实践中,随机数的质量直接影响仿真结果的准确性、游戏体验的公平性以及加密系统的安全性。C/C++提供了从传统的rand()/srand()到C++11现代<random>库的多种实现方案,其中梅森旋转算法(mt19937)因其极长周期和优良统计属性成为高性能应用的首选。在多线程环境下,通过thread_local存储引擎实例可确保线程安全与高性能。本文聚焦于蒙特卡洛模拟、游戏事件触发和抽奖

weixin_30566111的博客 410

Fortran基础编程(3)——格式化输出

本篇推文将进一步讲解Fortran基础语法中格式化输出与声明部分,让我们的代码更加美观起来吧~

qq_45715554的博客 3827

C/C++刷题环境搭建与STL实战:从零掌握算法底层实现

算法是计算机科学的核心基础,其本质是通过特定步骤高效解决计算问题。理解算法的时间与空间复杂度,关键在于掌握数据在内存中的组织与访问方式。C/C++语言因其贴近硬件、内存管理透明的特性,成为深入理解算法底层原理的理想工具。通过手动管理内存、操作指针,开发者能直观感知数据结构的扩容、拷贝开销,从而建立对算法性能的深刻认知。在工程实践中,标准模板库(STL)提供了vector、unordered_map等高效容器,配合sort、binary_search等泛型算法,能极大提升开发效率。本文以LeetCode算法训

weixin_30423977的博客 351

RISC-V— 架构基础知识学习

蜂鸟 E200 系列是一个开源的RISC-V 处理器。蜂鸟 E200 系列由中国大陆研发团队开发,用户能够轻松与开发人员取得交流和支持。RI蜂鸟 E200 处理器研发团队拥有在国际一流公司多年开发处理器的经验,使用稳健的Verilog 2001 语法编写的可综合 RTL 代码,以工业级标准进行开发。蜂鸟 E200 的代码为人工编写,添加丰富的注释且可读性强,非常易于理解。

deilt 1万+

Linux iperf 进行跑流测试时,为啥单条流会有速率上不去的问题?

iperf

1042484520@qq.com(邮箱) 3088

现代C++17高性能哈希库:XXHash的工程实践与优化指南

哈希算法是计算机科学中用于数据完整性校验、快速查找和去重的基础技术,其核心原理是将任意长度的输入通过散列函数映射为固定长度的输出。在追求极致性能的工程场景中,非加密哈希算法因其极高的计算速度而备受青睐。XXHash作为一种设计精良的非加密哈希算法,在保证低碰撞率的同时,能够实现接近内存带宽极限的吞吐量,尤其适用于海量数据处理、实时系统和高性能计算领域。其现代C++17封装版本进一步提升了技术价值,通过RAII资源管理、强类型接口和constexpr编译期计算等特性,显著增强了代码的安全性、可读性和性能。在实

weixin_34037173的博客 444

《使用R包ggtree进行进化树的绘制与美化》

都2023年了,才去使用Y叔早在2018年发表的进化树构建利器——ggtree。刚好最近在做基因家族分析,进化树的构建与美化确实有点麻烦,先前使用MEGA11进行了绘制,但图像简陋,于是导出了nwk文件,准备使用其他软件进行美化。这里,我使用ggtree包进行操作。

沉香best的博客 6896

C++可变形参函数:从va_list到可变参数模板的演进与实战

在C++编程中,函数参数处理是基础且关键的技术点。传统函数需要预先定义参数数量和类型,这在处理不确定数量参数的场景下显得力不从心。为了解决这一问题,C++提供了多种可变形参函数实现方式,其核心原理是通过参数包或特殊数据结构在编译期或运行时动态处理参数。这项技术的价值在于极大提升了代码的灵活性和复用性,使得开发者能够编写更通用、简洁的接口,特别是在日志系统、工厂方法、数据序列化等需要高度灵活性的应用场景中。本文聚焦于C++可变形参函数的技术演进,深入探讨了从C风格va_list到现代可变参数模板的解决方案,其

weixin_33885676的博客 344

ORB-SLAM3算法2之EuRoc开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

ORB-SLAM3算法1 已成功编译安装ORB-SLAM3到本地,本篇目的是用EuRoc开源数据来运行ORB-SLAM3,并生成轨迹,最后用evo评估工具来评估ORB-SLAM3生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 3762

YOLOv11的网络结构概览(Backbone-Neck-Head):介绍骨干网络(Backbone)、特征融合层(Neck)和检测头(Head)的作用

YOLOv11架构解析:从特征提取到目标检测 YOLOv11继承了YOLO系列的经典三组件架构,包含Backbone、Neck和Head三部分。Backbone基于改进的CSPDarknet,通过Conv和C3模块进行多尺度特征提取;Neck采用FPN+PAN结构融合不同层次特征;Head负责检测任务输出。网络整体设计注重高效性和多尺度特征融合,采用C3模块优化信息流和梯度流,配合SPPCSPC增强特征表达能力。该架构在保持实时检测速度的同时,提升了目标检测精度,体现了YOLO系列"一次看全图&q

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1万+
上一篇: shell脚本:实现监控进程内存
下一篇: 类的右值构造函数和右值赋值运算符函数写法
力宁
博客等级 码龄12年 13粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值