跳至主要內容

1360. 日期之间隔几天


1360. 日期之间隔几天

🟢   🔖  数学 字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

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 and 2100.

题目大意

请你编写一个程序来计算两个日期之间隔了多少天。

日期以字符串形式给出,格式为 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统计共同度过的日子数数学 字符串🟢🀄️open in new window 🔗open in new window