1360. 日期之间隔几天
1360. 日期之间隔几天
题目
Write a program to count the number of days between two dates.
The two dates are given as strings, their format is YYYY-MM-DD
as shown in the examples.
Example 1:
Input: date1 = "2019-06-29", date2 = "2019-06-30"
Output: 1
Example 2:
Input: date1 = "2020-01-15", date2 = "2019-12-31"
Output: 15
Constraints:
- The given dates are valid dates between the years
1971
and2100
.
题目大意
请你编写一个程序来计算两个日期之间隔了多少天。
日期以字符串形式给出,格式为 YYYY-MM-DD
,如示例所示。
示例 1:
输入: date1 = "2019-06-29", date2 = "2019-06-30"
输出: 1
示例 2:
输入: date1 = "2020-01-15", date2 = "2019-12-31"
输出: 15
提示:
- 给定的日期是
1971
年到2100
年之间的有效日期。
解题思路
日期差计算:
将每个日期转换为自公元 1970 年 1 月 1 日起的累计天数,然后计算两个日期的绝对天数差。
注意闰年判断:
- 闰年规则:如果年份能被 4 整除但不能被 100 整除,或者能被 400 整除,则为闰年。
- 闰年有 366 天,普通年份有 365 天。
- 闰年 2 月有 29 天,普通年份 2 月有 28 天。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是输入年份与 1970 年的差值,每个日期需要遍历从 1970 年到输入年份的所有年份。 - 空间复杂度:
O(1)
,仅使用了常量空间存储数组和中间变量。
代码
/**
* @param {string} date1
* @param {string} date2
* @return {number}
*/
var daysBetweenDates = function (date1, date2) {
// 返回两个日期的绝对天数差
return Math.abs(getDays(date1) - getDays(date2));
};
// 判断是否是闰年
var isLeapYear = function (year) {
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
};
// 计算某个日期自1970年1月1日起的累计天数
var getDays = function (date) {
// 普通年份的每月天数
const daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const [year, month, day] = date.split('-').map(Number);
let days = 0;
// 累加从1970年到前一年所有年份的天数
for (let i = 1970; i < year; i++) {
days += isLeapYear(i) ? 366 : 365;
}
// 累加当前年份前几个月的天数
for (let i = 1; i < month; i++) {
days += daysInMonth[i - 1];
if (i === 2 && isLeapYear(year)) {
days += 1; // 闰年额外加1天
}
}
// 加上当月天数
return days + day;
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
2409 | 统计共同度过的日子数 | 数学 字符串 | 🟢 | 🀄️ 🔗 |