Description#
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
.
Solutions#
Solution 1: Mathematics#
First, we define a function isLeapYear(year)
to determine whether the given year year
is a leap year. If it is a leap year, return true
, otherwise return false
.
Next, we define another function daysInMonth(year, month)
to calculate the total number of days in the given year year
and month month
. We can use an array days
to store the number of days in each month, where days[1]
represents the number of days in February. If it is a leap year, it is $29$ days, otherwise it is $28$ days.
Then, we define another function calcDays(date)
to calculate the number of days from the given date date
to 1971-01-01
. We can use date.split("-")
to split the date date
into year year
, month month
, and day day
by -
. Then we can use a loop to calculate the total number of days from 1971
to year
, then calculate the total number of days from January to month
, and finally add day
days.
Finally, we only need to return the absolute value of calcDays(date1) - calcDays(date2)
.
The time complexity is $O(y + m)$, where $y$ represents the number of years from the given date to 1971-01-01
, and $m$ represents the number of months of the given date. The space complexity is $O(1)$.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| class Solution:
def daysBetweenDates(self, date1: str, date2: str) -> int:
def isLeapYear(year: int) -> bool:
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
def daysInMonth(year: int, month: int) -> int:
days = [
31,
28 + int(isLeapYear(year)),
31,
30,
31,
30,
31,
31,
30,
31,
30,
31,
]
return days[month - 1]
def calcDays(date: str) -> int:
year, month, day = map(int, date.split("-"))
days = 0
for y in range(1971, year):
days += 365 + int(isLeapYear(y))
for m in range(1, month):
days += daysInMonth(year, m)
days += day
return days
return abs(calcDays(date1) - calcDays(date2))
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| class Solution {
public int daysBetweenDates(String date1, String date2) {
return Math.abs(calcDays(date1) - calcDays(date2));
}
private boolean isLeapYear(int year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
private int daysInMonth(int year, int month) {
int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
days[1] += isLeapYear(year) ? 1 : 0;
return days[month - 1];
}
private int calcDays(String date) {
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(5, 7));
int day = Integer.parseInt(date.substring(8));
int days = 0;
for (int y = 1971; y < year; ++y) {
days += isLeapYear(y) ? 366 : 365;
}
for (int m = 1; m < month; ++m) {
days += daysInMonth(year, m);
}
days += day;
return days;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| class Solution {
public:
int daysBetweenDates(string date1, string date2) {
return abs(calcDays(date1) - calcDays(date2));
}
bool isLeapYear(int year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
int daysInMonth(int year, int month) {
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
days[1] += isLeapYear(year);
return days[month - 1];
}
int calcDays(string date) {
int year = stoi(date.substr(0, 4));
int month = stoi(date.substr(5, 2));
int day = stoi(date.substr(8, 2));
int days = 0;
for (int y = 1971; y < year; ++y) {
days += 365 + isLeapYear(y);
}
for (int m = 1; m < month; ++m) {
days += daysInMonth(year, m);
}
days += day;
return days;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| func daysBetweenDates(date1 string, date2 string) int {
return abs(calcDays(date1) - calcDays(date2))
}
func isLeapYear(year int) bool {
return year%4 == 0 && (year%100 != 0 || year%400 == 0)
}
func daysInMonth(year, month int) int {
days := [12]int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
if isLeapYear(year) {
days[1] = 29
}
return days[month-1]
}
func calcDays(date string) int {
year, _ := strconv.Atoi(date[:4])
month, _ := strconv.Atoi(date[5:7])
day, _ := strconv.Atoi(date[8:])
days := 0
for y := 1971; y < year; y++ {
days += 365
if isLeapYear(y) {
days++
}
}
for m := 1; m < month; m++ {
days += daysInMonth(year, m)
}
days += day
return days
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| function daysBetweenDates(date1: string, date2: string): number {
return Math.abs(calcDays(date1) - calcDays(date2));
}
function isLeapYear(year: number): boolean {
return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
}
function daysOfMonth(year: number, month: number): number {
const days = [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
return days[month - 1];
}
function calcDays(date: string): number {
let days = 0;
const [year, month, day] = date.split('-').map(Number);
for (let y = 1971; y < year; ++y) {
days += isLeapYear(y) ? 366 : 365;
}
for (let m = 1; m < month; ++m) {
days += daysOfMonth(year, m);
}
days += day - 1;
return days;
}
|