C++日期与时间

C++日期与时间

C语言风格函数

#include <ctime>

cpp 复制代码
#ifndef _CRT_NO_TIME_T
    #ifdef _USE_32BIT_TIME_T
        typedef __time32_t time_t;
    #else
        typedef __time64_t time_t;
    #endif
#endif

std::time_t其实就是整形

函数 功能描述 返回值类型
time() 获取当前日历时间 time_t
localtime_s() 将time_t转换为本地时间的tm结构 tm*
gmtime_s() 将time_t转换为UTC时间的tm结构 tm*
mktime() 将tm结构转换为time_t time_t
strftime() 格式化时间输出(可自定义格式%Y-%m-%d) size_t
asctime_s 格式化时间输出(不可自定义格式) 返回0表示成功
clock() 获取程序处理器时间(可用来计时) clock_t
difftime() 计算两个time_t的时间差 double
tm结构体
成员 类型 描述 范围
tm_sec int [0, 60] including leap second
tm_min int [0-59]
tm_hour int [0-23]
tm_mday int 月中的日 [1-31]
tm_mon int 月(从0开始) [0-11],0表示一月
tm_year int 年(从1900开始) 实际年份-1900
tm_wday int 星期几(0=周日) [0-6],0表示周日
tm_yday int 年中的日(从0开始) [0-365]
tm_isdst int 夏令时标志 >0:启用, 0:禁用, <0:未知
格式说明
格式 说明
%Y 4位年份 (2025)
%y 2位年份 (23)
%m 月份 (01-12)
%d 日期 (01-31)
%H 小时 (00-23)
%M 分钟 (00-59)
%S 秒 (00-60)
%A 完整星期几名称
%a 缩写星期几名称
%B 完整月份名称
%b 缩写月份名称
%Z 时区名称
cpp 复制代码
void printTm(std::tm* tm) {
	char buffer[50];
	strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm);
	std::cout << buffer << std::endl;
	//if (asctime_s(buffer, sizeof(buffer), tm) == 0) {
	//	std::cout << buffer << std::endl;
	//}
}

int main()
{
	system("chcp 65001");
	clock_t start = clock();
	// 获取当前时间(秒)
	std::time_t now = time(nullptr);
	std::cout << "now= " << now << std::endl;

	// 获取当前时间(秒)
	std::time_t currentTime;
	time(&currentTime);
	currentTime += 10000;
	std::cout << "currentTime= " << currentTime << std::endl;

	// 转换为本地时间
	std::tm tmNow;
	localtime_s(&tmNow, &now);
	printTm(&tmNow);

	// 转换为UTC时间
	std::tm tmCurrentTime;
	gmtime_s(&tmCurrentTime, &currentTime);
	printTm(&tmCurrentTime);

	// 两个std::time_t时间差
	double diff = now > currentTime ? difftime(now, currentTime) : difftime(currentTime, now);
	std::cout << "diff= " << diff << std::endl;

	// 增加天数(跨月了不会自增计算,直接报错)
	tmNow.tm_mday += 1;
	printTm(&tmNow);
	// std::tm -> d::time_t
	now = mktime(&tmNow);
	std::cout << "now= " << now << std::endl;

	clock_t end = clock();
	long duration = (double)(end - start) / CLOCKS_PER_SEC;
	std::cout << "duration= " << (end - start) << "ms" << std::endl;
	std::cout << "duration= " << duration << "s" << std::endl;
}

C++风格函数

#include <chrono>

三大组件

组件类型 作用 主要类型 线程安全
Clock (时钟) 提供时间点 system_clock, steady_clock, high_resolution_clock
Time Point (时间点) 表示特定时刻 time_point<Clock, Duration>
Duration (持续时间) 表示时间间隔 duration<Rep, Period>

1、时钟类型

时钟类型 描述 可转换为 time_t 单调性 用途 分辨率
system_clock 系统实时时钟 ✅ 是 ❌ 否 日期时间显示、与其他系统交互 通常为纳秒
steady_clock 稳定时钟 ❌ 否 ✅ 是 时间间隔测量、超时控制 高分辨率
high_resolution_clock 高分辨率时钟 可能 可能 高精度计时 最高可用分辨率
utc_clock‌ 协调世界时 是(通过to_time_t 非单调 表示协调世界时(UTC),考虑闰秒调整 通常为纳秒级
tai_clock‌ 国际原子时 是(通过to_time_t 单调 表示国际原子时(TAI),不考虑闰秒,稳定递增 通常为纳秒级
gps_clock‌ 全球定位系统时 是(通过to_time_t 单调 全球定位系统时间,以1980年1月6日为起点 通常为纳秒级
file_clock‌ 文件系统时间 取决于实现 文件系统时间戳操作,用于文件创建和修改时间 通常为100纳秒
local_t‌ 本地时间 是(需配合system_clock) 非单调 本地时间,不带时区信息的挂钟时间 与system_clock相同
cpp 复制代码
int main()
{
	system("chcp 65001");
	// system_clock 获取当前日期时间
	auto sys_now = std::chrono::system_clock::now();
	std::time_t time_t_now = std::chrono::system_clock::to_time_t(sys_now + 1h);
	std::cout << "system_clock: " << time_t_now << endl;

	// steady_clock 测量时间间隔
	auto start = std::chrono::steady_clock::now();
	auto end = std::chrono::steady_clock::now();
	end += 100s;
	std::cout << "steady_clock diff: " << std::chrono::duration_cast<std::chrono::seconds>(end - start) << endl;

	// high_resolution_clock 高精度计时(底层可能是steady_clock的别名)
	auto high_res_start = std::chrono::high_resolution_clock::now();
	auto high_res_end = std::chrono::high_resolution_clock::now();
	high_res_end += 10min;
	std::cout << "high_resolution_clock diff: " << std::chrono::duration_cast<std::chrono::seconds>(high_res_end - high_res_start) << endl;

	// utc_clock 协调世界时间
	auto utc_time_start = clock_cast<std::chrono::utc_clock>(sys_now);
	utc_time_start = std::chrono::utc_clock::from_sys(sys_now);
	auto utc_time_end = std::chrono::utc_clock::now();
	utc_time_end += 2h;
	std::cout << "utc_clock diff: " << std::chrono::duration_cast<std::chrono::seconds>(utc_time_end - utc_time_start) << endl;

	// tai_clock‌ 国际原子时间
	auto tai_clock_start = std::chrono::tai_clock::from_utc(utc_time_start);
	auto tai_clock_end = std::chrono::tai_clock::now();
	tai_clock_end += 1min;
	std::cout << "tai_clock diff: " << std::chrono::duration_cast<std::chrono::seconds>(tai_clock_end - tai_clock_start) << endl;

	// gps_clock‌ 全球定位系统时
	auto gps_clock_start = std::chrono::gps_clock::from_utc(utc_time_start);
	auto gps_clock_end = std::chrono::gps_clock::now();
	gps_clock_end += 1min;
	std::cout << "gps_clock diff: " << std::chrono::duration_cast<std::chrono::seconds>(gps_clock_end - gps_clock_start) << endl;

	// file_clock 文件系统时间
	auto file_clock_start = std::chrono::file_clock::from_utc(utc_time_start);
	auto file_clock_end = std::chrono::file_clock::now();
	file_clock_end += 2min;
	std::cout << "file_clock diff: " << std::chrono::duration_cast<std::chrono::seconds>(file_clock_end - file_clock_start) << endl;
}

2、时间间隔

Duration 类型 Ratio 描述 示例
std::chrono::nanoseconds std::ratio<1, 1000000000> 纳秒 1ns
std::chrono::microseconds std::ratio<1, 1000000> 微秒 1μs
std::chrono::milliseconds std::ratio<1, 1000> 毫秒 1ms
std::chrono::seconds std::ratio<1> 1s
std::chrono::minutes std::ratio<60> 分钟 1min
std::chrono::hours std::ratio<3600> 小时 1h
std::chrono::days std::ratio<86400> 1d
std::chrono::weeks duration<int, ratio_multiply<ratio<7>, days::period>>
std::chrono::months duration<int, ratio_divide<years::period, ratio<12>>>
std::chrono::years duration<int, ratio_multiply<ratio<146097, 400>, days::period>> 1y
运算符
运算类型 语法 说明 示例
构造 duration<Rep, Period> d(value) 创建持续时间 seconds(5)
转换 duration_cast<To>(from) 显式单位转换 duration_cast<minutes>(seconds(120))
加法 d1 + d2 相同或兼容单位相加 seconds(5) + milliseconds(500)
减法 d1 - d2 相同或兼容单位相减 minutes(10) - seconds(30)
乘法 d * scalar 持续时间乘以标量 seconds(5) * 2
除法 d / scalar 持续时间除以标量 minutes(10) / 2
取模 d1 % d2 持续时间取模 seconds(125) % minutes(2)

3、时间点

操作类型 语法 说明 示例
获取当前时间 Clock::now() 获取当前时间点 system_clock::now()
构造 time_point<Clock, Duration>(duration) 从持续时间构造 time_point<system_clock>(seconds(0))
时间运算 tp + duration 时间点加持续时间 now + hours(24)
时间差 tp1 - tp2 计算两个时间点的差 end - start
比较 tp1 < tp2 比较时间点先后 deadline < now

新特性

1、字面量

字面量 对应类型 示例
ns nanoseconds 1000ns
us microseconds 1000us
ms milliseconds 1000ms
s seconds 60s
min minutes 5min
h hours 24h
d day 1d
y year 1y

2、截取

特性 描述 示例
floor/ceil/round 持续时间舍入 floor<milliseconds>(1234567ns)
v 后缀 无单位数值 42s / 2
相关推荐
Cx330❀21 分钟前
C++ map 全面解析:从基础用法到实战技巧
开发语言·c++·算法
1***Q78423 分钟前
Python增强现实案例
开发语言·python·ar
枫叶丹428 分钟前
openGauss:面向数字时代的下一代企业级开源关系型数据库
开发语言·数据库·开源·自动化
CS_浮鱼34 分钟前
【Linux】线程
linux·c++·算法
智者知已应修善业38 分钟前
【51单片机LED贪吃蛇】2023-3-27
c语言·c++·经验分享·笔记·嵌入式硬件·51单片机
Demon--hx2 小时前
[C++]迭代器
开发语言·c++
BanyeBirth2 小时前
C++窗口问题
开发语言·c++·算法
q***06293 小时前
PHP进阶-在Ubuntu上搭建LAMP环境教程
开发语言·ubuntu·php
郝学胜-神的一滴6 小时前
Qt的QSlider控件详解:从API到样式美化
开发语言·c++·qt·程序人生
橘颂TA6 小时前
【剑斩OFFER】算法的暴力美学——连续数组
c++·算法·leetcode·结构与算法