0

0

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

冰火之心

冰火之心

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

|

244人浏览过

|

来源于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 = 0tm_mon = 13mktime 不报错也不修正,直接返回 -1,接着 std::difftime 算出来就是负的巨大值。不是 bug,是标准行为。

  • 务必检查 mktime(&tm1) == -1 || mktime(&tm2) == -1
  • tm_wdaytm_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 天。

SophNet
SophNet

专业的AI开发工具平台,让AI集成变得简单高效。

下载

立即学习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++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

344

2025.06.09

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

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

199

2025.07.04

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

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

254

2025.08.29

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

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

105

2025.10.23

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

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

1161

2023.07.26

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

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

1150

2023.07.27

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

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

820

2023.08.01

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

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

460

2023.08.02

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.7万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号