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

C++ | 时间日期

时间处理是软件开发中的基础需求,无论是日志记录、性能分析还是定时任务都离不开时间操作。虽然C++标准库没有原生的日期类型,但通过继承C语言的时间函数库,仍然可以实现强大的时间处理功能。本文将全面解析C++时间操作技巧,助你轻松驾驭时间管理!


一、时间处理基础架构

1. 核心头文件

#include <ctime>  // C风格时间函数
#include <chrono> // C++11时间库

2. 关键数据类型

类型描述典型用途
time_t算术类型,通常表示秒数存储时间戳
tm结构化时间类型时间分解
clock_t处理器时钟类型性能计时

二、时间获取四部曲

1. 获取时间戳

time_t now = time(nullptr);  // C++11推荐写法
// 等效于
time(&now);                  // 传统写法

2. 转换本地时间

tm* local_time = localtime(&now);
// 注意:非线程安全!

3. 转换UTC时间

tm* utc_time = gmtime(&now);

4. 时间格式化输出

char buffer[80];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);
cout << "格式化时间: " << buffer << endl;

三、tm结构体深度解析

//成员变量说明
struct tm {
    int tm_sec;    // 秒 [0-60] (允许润秒)
    int tm_min;    // 分 [0-59]
    int tm_hour;   // 时 [0-23]
    int tm_mday;   // 日 [1-31]
    int tm_mon;    // 月 [0-11]
    int tm_year;   // 年(实际年份=1900+tm_year)
    int tm_wday;   // 星期 [0-6] 0=周日
    int tm_yday;   // 年日 [0-365]
    int tm_isdst;  // 夏令时标志
};
//使用要点

tm* t = localtime(&now);
cout << "当前年份: " << 1900 + t->tm_year << endl;
cout << "当前月份: " << 1 + t->tm_mon << endl; // 注意+1修正

四、七大时间函数详解

1. 时间戳转换

// 时间戳转字符串(固定格式)
char* str_time = ctime(&now); 

// 结构体转字符串(固定格式)
char* asc_time = asctime(local_time);

2. 时间计算

// 计算时间差(秒)
double diff = difftime(time2, time1);

// 日历时间转时间戳
time_t mk_time = mktime(local_time);

3. 计时功能

clock_t start = clock();
// ...执行代码...
clock_t end = clock();
double duration = double(end - start)/CLOCKS_PER_SEC;

五、时间格式化秘籍

strftime格式说明符

说明符含义示例
%Y四位数年份2023
%m两位数月份07
%d两位数日期15
%H24小时制小时14
%M分钟05
%S30
%A完整星期名称Monday
%B完整月份名称July
%T等价于%H:%M:%S14:05:30

自定义格式示例

strftime(buffer, 80, "[%Y-%m-%d %T] 日志记录", local_time);
// 输出示例:[2023-07-15 14:05:30] 日志记录

六、实战代码示例

示例1:获取完整时间信息

time_t now = time(nullptr);
tm* lt = localtime(&now);

cout << "当前时间: " 
     << lt->tm_year + 1900 << "-"
     << setw(2) << setfill('0') << lt->tm_mon + 1 << "-"
     << setw(2) << lt->tm_mday << " "
     << setw(2) << lt->tm_hour << ":"
     << setw(2) << lt->tm_min << ":"
     << setw(2) << lt->tm_sec << endl;

示例2:计算程序运行时间

clock_t start = clock();
// ...需要计时的代码...
clock_t end = clock();

cout << "耗时: " 
     << (double)(end - start)/CLOCKS_PER_SEC * 1000 
     << " 毫秒" << endl;

七、注意事项与进阶技巧

1. 线程安全问题

  • localtime()gmtime()等函数返回静态内存指针

  • 多线程环境应使用:

    tm local_time;
    localtime_r(&now, &local_time); // POSIX标准

2. 时区处理

// 获取时区信息
long timezone;
tzset();
cout << "时区偏移: " << timezone/3600 << " 小时" << endl;

3. C++11时间库(chrono)

#include <chrono>
using namespace std::chrono;

auto now = system_clock::now();
time_t now_c = system_clock::to_time_t(now);

八、常见问题解决方案

Q1:为什么tm_mon要+1?

  • 结构体设计月份范围为0-11,对应1月到12月

Q2:如何计算两个日期间隔?

tm time1 = {0}, time2 = {0};
// 填充结构体...
time_t t1 = mktime(&time1);
time_t t2 = mktime(&time2);
double diff = difftime(t2, t1);

Q3:如何处理夏令时?

  • 检查tm_isdst字段

  • 使用操作系统级时间函数


掌握这些时间操作技巧,你将能轻松应对各种时间处理需求。建议在实际开发中:

  1. 优先使用线程安全函数

  2. 重要时间操作添加错误检查

  3. 复杂场景考虑使用C++11 chrono库


文章转载自:
http://accredit.zekgq.cn
http://broadtail.zekgq.cn
http://aquarium.zekgq.cn
http://antipodes.zekgq.cn
http://angara.zekgq.cn
http://beating.zekgq.cn
http://addressable.zekgq.cn
http://bathtub.zekgq.cn
http://airline.zekgq.cn
http://anilin.zekgq.cn
http://aboriginally.zekgq.cn
http://automation.zekgq.cn
http://acetyl.zekgq.cn
http://baronage.zekgq.cn
http://bullrush.zekgq.cn
http://biocoenology.zekgq.cn
http://acrobatic.zekgq.cn
http://brevet.zekgq.cn
http://biestings.zekgq.cn
http://anovulant.zekgq.cn
http://baudekin.zekgq.cn
http://basho.zekgq.cn
http://chlorofluoromethane.zekgq.cn
http://badmintoon.zekgq.cn
http://cardioactive.zekgq.cn
http://adret.zekgq.cn
http://bacteriuria.zekgq.cn
http://arabia.zekgq.cn
http://caricature.zekgq.cn
http://acromegalic.zekgq.cn
http://www.dtcms.com/a/126290.html

相关文章:

  • WEB 前端学 JAVA(一)
  • Qwen2.5-7B-Instruct FastApi 部署调用教程
  • YOLO学习笔记 | YOLOv8 全流程训练步骤详解(2025年4月更新)
  • 知行之桥2025版账号密码修改和重置指南
  • .NET WPF 可视化树(Visual Tree)
  • MCP工具的配置文件格式是怎么样的?MCP教程平台推荐
  • RVOS-3.实现内存管理
  • Compose 适配 - 响应式排版 自适应布局
  • 基于SpringBoot的智慧社区管理系统(源码+数据库)
  • 蓝桥杯单片机刷题——通过按键触发串口传输电压值
  • 这种情况是应为VScode的版本太新了,更新到1.86版本后要求远程连接服务器的内核版本不符合条件
  • 【力扣hot100题】(075)数据流的中位数
  • 2025年3月GESPC++三级考级真题——2025
  • Elasticsearch 系列专题 - 第六篇:高级功能与生态系统
  • P8627 [蓝桥杯 2015 省 A] 饮料换购
  • Linux用户切换命令区别详解
  • 【JDBC-54】JDBC:Java数据库连接的桥梁与核心特性解析
  • 进度计划频繁变更,如何稳定推进
  • 【含文档+PPT+源码】基于微信小程序的小区物业收费管理系统
  • 【C++游戏引擎开发】第9篇:数学计算库GLM(线性代数)、CGAL(几何计算)的安装与使用指南
  • Windows下编译SALOME
  • spm12_fMRI 2*4混合方差分析 Flexible factorial 对比矩阵
  • 多模态大语言模型arxiv论文略读(十)
  • vue3 history路由模式刷新页面报错问题解决
  • 华宇TAS应用中间件与联奕科技多款软件产品完成兼容互认证
  • 机场跑道异物检测数据集VOC+YOLO格式33793张31类别
  • 位运算与实战场景分析-Java代码版
  • Ubuntu搭建Pytorch环境
  • 操作系统 4.4-从生磁盘到文件
  • 无法读取库伦值文件节点解决方案