当前位置: 首页 > news >正文

【C++】日期和时间

C++ 提供了多种处理日期和时间的功能,主要通过标准库 <ctime><chrono> 提供。以下是 C++ 中处理日期和时间的功能介绍及其用法:

1. <ctime>

<ctime> 是 C++ 中处理时间的传统库,提供了一些基本的时间操作函数。这些函数主要基于 C 语言的时间处理方式,适合处理简单的时间任务。

1.1. 获取当前时间
#include <iostream>
#include <ctime>int main() {// 获取当前时间std::time_t currentTime = std::time(nullptr);// 输出当前时间的秒数(自1970年1月1日以来的秒数)std::cout << "当前时间(秒数): " << currentTime << std::endl;return 0;
}

std::time(nullptr) 返回当前时间的时间戳,即自 Unix 纪元(1970年1月1日)以来的秒数。

1.2. 时间转换

将时间戳转换为本地时间或 UTC 时间。

#include <iostream>
#include <ctime>int main() {// 获取当前时间std::time_t currentTime = std::time(nullptr);// 转换为本地时间std::tm* localTime = std::localtime(&currentTime);std::cout << "本地时间: " << std::asctime(localTime);// 转换为 UTC 时间std::tm* utcTime = std::gmtime(&currentTime);std::cout << "UTC 时间: " << std::asctime(utcTime);return 0;
}
  • std::localtime(&currentTime) 将时间戳转换为本地时间。
  • std::gmtime(&currentTime) 将时间戳转换为 UTC 时间。
  • std::asctime(localTime) 输出格式化的时间字符串。
1.3. 格式化时间输出

可以使用 strftime 函数来格式化时间字符串。

#include <iostream>
#include <ctime>int main() {// 获取当前时间std::time_t currentTime = std::time(nullptr);std::tm* localTime = std::localtime(&currentTime);// 定义缓冲区来存储格式化时间char buffer[80];std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localTime);std::cout << "格式化时间: " << buffer << std::endl;return 0;
}

strftime 使用格式字符串来定义输出格式,例如:

  • %Y: 年(四位数)
  • %m: 月(两位数)
  • %d: 日(两位数)
  • %H: 小时(24小时制)
  • %M: 分钟
  • %S: 秒
1.4. 计时操作

可以使用 clock() 函数来计算代码执行时间:

#include <iostream>
#include <ctime>int main() {// 记录起始时间std::clock_t start = std::clock();// 模拟一些工作for (volatile int i = 0; i < 100000000; ++i);// 记录结束时间std::clock_t end = std::clock();// 计算耗时(秒)double duration = static_cast<double>(end - start) / CLOCKS_PER_SEC;std::cout << "执行时间: " << duration << " 秒" << std::endl;return 0;
}

2. <chrono>

<chrono> 是 C++11 引入的现代时间库,提供了更加灵活和精确的时间操作功能。它支持多种时间单位(如秒、毫秒、纳秒等)以及更复杂的时间计算。

2.1. 获取当前时间

<chrono> 使用 system_clock 类获取当前时间:

#include <iostream>
#include <chrono>int main() {// 获取当前时间点auto currentTime = std::chrono::system_clock::now();// 转换为时间戳std::time_t currentTimeT = std::chrono::system_clock::to_time_t(currentTime);std::cout << "当前时间: " << std::ctime(&currentTimeT);return 0;
}
2.2. 时间计算

<chrono> 提供了简单的时间加减计算操作:

#include <iostream>
#include <chrono>int main() {// 获取当前时间点auto startTime = std::chrono::steady_clock::now();// 模拟一些工作for (volatile int i = 0; i < 100000000; ++i);// 获取结束时间点auto endTime = std::chrono::steady_clock::now();// 计算持续时间auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime);std::cout << "执行时间: " << duration.count() << " 毫秒" << std::endl;return 0;
}
  • steady_clock 是一个单调递增的时钟,适用于测量时间间隔。
  • duration_cast 用于将时间单位转换为毫秒、秒等。
2.3. 使用不同时间单位

<chrono> 支持多种时间单位,如秒、毫秒、微秒、纳秒等:

#include <iostream>
#include <chrono>int main() {using namespace std::chrono;// 创建一个持续时间(3秒)seconds duration(3);// 转换为毫秒milliseconds ms = duration_cast<milliseconds>(duration);std::cout << "3秒等于 " << ms.count() << " 毫秒" << std::endl;return 0;
}
2.4. 定时器

使用 <chrono> 可以轻松实现定时器功能:

#include <iostream>
#include <chrono>
#include <thread>int main() {std::cout << "等待3秒..." << std::endl;// 等待3秒std::this_thread::sleep_for(std::chrono::seconds(3));std::cout << "时间到!" << std::endl;return 0;
}

总结

  • <ctime>:适合简单的时间操作,如获取当前时间、时间戳转换和基本的计时操作。
  • <chrono>:更现代化和灵活的时间库,支持精确的时间单位、多种时钟类型和时间计算操作,适合复杂的时间处理需求。

根据具体需求,可以选择使用传统的 <ctime> 或现代的 <chrono> 库。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringCloudGateway网关技术
  • 【Kotlin设计模式】Kotlin实现工厂模式
  • 【WPF】WPF学习之面试常问问题
  • Visual Studio中 自动生成版本号递增版本号
  • React 入门第四天:理解React中的路由与导航
  • 【C#】字段
  • 点晴oa办公系统提效管理+业务协同
  • 极光公布2024年第二季度财报
  • MYSQL -NATURAL JOIN ,单行函数
  • FFmpeg的入门实践系列四(AVS)
  • 给鼠标一个好看的指针特效 鼠标光标如何修改形状?
  • Cisco-综合实验二
  • Linux--NAT,代理服务,内网穿透
  • Python网络爬虫模拟登录与验证解析
  • 为什么要学习 CCRC-PIPP
  • JavaScript-如何实现克隆(clone)函数
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • fetch 从初识到应用
  • go append函数以及写入
  • golang 发送GET和POST示例
  • gops —— Go 程序诊断分析工具
  • Java超时控制的实现
  • js中的正则表达式入门
  • Linux下的乱码问题
  • node.js
  • nodejs调试方法
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • 包装类对象
  • 力扣(LeetCode)56
  • 项目管理碎碎念系列之一:干系人管理
  • 国内开源镜像站点
  • ​​​【收录 Hello 算法】9.4 小结
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​批处理文件中的errorlevel用法
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • ###C语言程序设计-----C语言学习(3)#
  • #define 用法
  • #传输# #传输数据判断#
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (70min)字节暑假实习二面(已挂)
  • (C11) 泛型表达式
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (备份) esp32 GPIO
  • (回溯) LeetCode 78. 子集
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (五)Python 垃圾回收机制
  • (一) storm的集群安装与配置
  • (转)ORM
  • ******之网络***——物理***
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net CHARTING图表控件下载地址
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 的程序集加载上下文