讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么计算两个日期之差_c++日期计算方法【实战】

千敏小哥_5334

千敏小哥_5334

发布时间:2026-02-19 08:07:03

|

304人浏览过

|

来源于php中文网

原创

最稳方法是用std::chrono结合std::tm转换:先设tm_isdst=-1,再mktime转time_t,最后整除86400;需校验mktime返回值,避免非法日期导致溢出或偏差。

c++怎么计算两个日期之差_c++日期计算方法【实战】

用 std::chrono 算两个日期差最稳

直接用 std::chrono + std::tm 转换,别碰 time_t 手动算天数——跨闰年、时区、夏令时全会翻车。C++20 的 std::chrono::year_month_day 更好,但老项目大概率还在用 C++11/14,所以重点讲兼容写法。

核心思路:把两个日期转成 std::time_t(秒级时间点),再相减除以 86400。但必须注意:两个 std::tm 都得设好 tm_isdst = -1,否则本地时区规则可能让结果偏一天。

  • std::mktime() 会修改传入的 std::tm,比如把 tm_mon = 12 自动进位,所以别复用同一结构体
  • 月份要减 1(tm_mon 是 0–11),年份要加 1900(tm_year 是距 1900 年的偏移)
  • 如果只关心“日历天数差”,忽略时分秒,建议统一设成中午 12:00,避免某天凌晨跨时区导致 mktime 返回前一天

std::mktime 返回 -1 就是输入非法

常见错误:传了 tm_mday = 0 或 tm_mon = 13,mktime 不报错也不修正,直接返回 -1,接着 std::difftime 算出来就是负的巨大值。不是 bug,是标准行为。

  • 务必检查 mktime(&tm1) == -1 || mktime(&tm2) == -1
  • tm_wday 和 tm_yday 不用填,mktime 会自动算;但 tm_isdst 必须设为 -1 让系统推断
  • Windows 下 mktime 对超大年份(如 10000 年)支持弱,Linux 一般撑到 2100 年左右没问题

只要日差?别用浮点除法

用 static_cast<int>(std::difftime(t2, t1) / 86400)</int> 看似简单,但 std::difftime 返回 double,对长跨度(比如 100 年)可能丢失精度——double 在 2^53 后无法精确表示每个整数秒,日差误差可能达 ±1 天。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“C++免费学习笔记(深入)”;

  • 改用整数截断:(t2 - t1) / 86400,前提是确认 t2 >= t1 且差值不溢出 time_t 有符号范围
  • 更安全的做法:用 std::lldiv 做整除,或直接用 C++20 的 std::chrono::duration_cast<:chrono::days></:chrono::days>
  • 如果两个日期在同一年且月份已知,手动按月累加天数反而更准(避开 mktime 的时区陷阱)

跨年/跨月计算容易漏掉边界

比如算 2023-01-31 到 2023-02-28,有人按“2 月有 28 天”直接减,得出 28 天,实际是 28 天没错;但若算 2024-01-31 到 2024-02-29,手动硬算就容易错——2 月有 29 天,但起始日 31 日在 2 月不存在,mktime 会自动折成 3 月 2 日,结果变成 33 天而非 29 天。

  • 这就是为什么不能跳过 mktime 直接数学算:它处理了所有“不存在的日期”的归约逻辑
  • 测试时至少覆盖:1 月 31 日→2 月 28/29 日、12 月 31 日→次年 1 月 1 日、闰年前后各一年
  • 如果业务明确只要“日历上看起来的天数差”(比如合同有效期),那得另写逻辑,和系统时间无关

真正麻烦的不是怎么算,而是搞清你要的到底是“经过多少个 24 小时”,还是“日历上翻了多少页”。前者靠 mktime,后者得自己建日期表或用第三方库比如 date.h。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5254

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5431

2025.07.04

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4528

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

864

2025.10.23

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3419

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2978

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1528

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2699

2023.08.02

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn