Math
String
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)$.
Python3 Java C++ Go TypeScript
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 ;
}
GitHub