如何实现计算两个日期字符串之间天数差的C++函数?
C++实现日期天数差计算
核心思路
- 将两个日期分别转换为从公元元年到该日期的总天数,两个总天数的绝对值差就是所求的天数间隔。
- 关键是实现一个日期转总天数的辅助函数,处理闰年、各月天数等细节。
辅助函数实现细节
- 日期解析:从输入的
YYYY-MM-DD格式字符串中提取年、月、日三个整数。 - 闰年判断:满足以下任一条件即为闰年:
- 能被4整除但不能被100整除
- 能被400整除
- 月份天数数组:平年各月天数为
{31,28,31,30,31,30,31,31,30,31,30,31},闰年二月加1天。 - 总天数计算:
- 累加从公元元年到目标年份前一年的所有天数(每闰年加366,平年加365)
- 累加目标年份中当前月份前所有月份的天数
- 加上当月的日期数
完整代码实现
#include <string> #include <cmath> #include <sstream> #include <vector> using namespace std; class Solution { public: int daysBetweenDates(string date1, string date2) { return abs(dateToDays(date1) - dateToDays(date2)); } private: bool isLeapYear(int year) { if (year % 400 == 0) return true; if (year % 100 == 0) return false; return year % 4 == 0; } int dateToDays(string date) { // 解析日期字符串 vector<int> parts; stringstream ss(date); string part; while (getline(ss, part, '-')) { parts.push_back(stoi(part)); } int year = parts[0], month = parts[1], day = parts[2]; // 各月天数(平年) int monthDays[] = {31,28,31,30,31,30,31,31,30,31,30,31}; int totalDays = 0; // 累加年份天数 for (int y = 1; y < year; ++y) { totalDays += isLeapYear(y) ? 366 : 365; } // 累加月份天数 for (int m = 1; m < month; ++m) { totalDays += monthDays[m-1]; if (m == 2 && isLeapYear(year)) { totalDays += 1; } } // 加上当月天数 totalDays += day; return totalDays; } };
示例验证
对于输入date1 = "2020-01-15"和date2 = "2019-12-31":
- 两个日期的总天数差为15,与预期结果一致。
内容的提问来源于stack exchange,提问作者Hoàng
相关产品推荐
相关产品推荐

