Number of Days Between Two Dates (E)
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
.
题意
计算两个日期之间的天数。
思路
几种方法:
- 直接调用java API;
- 累加较小日期的天数,直到两日期相等;
- 将每个日期都转化为到1970-01-00的天数,最后相减(实际上就是自己实现了java API)
代码实现 - API
import java.time.LocalDate;
class Solution {
public int daysBetweenDates(String date1, String date2) {
return (int) Math.abs(LocalDate.parse(date1).toEpochDay() - LocalDate.parse(date2).toEpochDay());
}
}
代码实现 - 累加
class Solution {
public int daysBetweenDates(String date1, String date2) {
if (date1.compareTo(date2) > 0) {
String temp = date1;
date1 = date2;
date2 = temp;
}
String[] s1 = date1.split("-"), s2 = date2.split("-");
int y1 = Integer.parseInt(s1[0]), y2 = Integer.parseInt(s2[0]);
int m1 = Integer.parseInt(s1[1]), m2 = Integer.parseInt(s2[1]);
int d1 = Integer.parseInt(s1[2]), d2 = Integer.parseInt(s2[2]);
int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int count = 0;
days[2] = isLeapYear(y1) ? 29 : 28;
while (y1 != y2 || m1 != m2 || d1 != d2) {
count++;
d1++;
if (d1 == days[m1] + 1) {
d1 = 1;
m1++;
}
if (m1 == 13) {
m1 = 1;
y1++;
days[2] = isLeapYear(y1) ? 29 : 28;
}
}
return count;
}
private boolean isLeapYear(int year) {
return year % 100 != 0 && year % 4 == 0 || year % 400 == 0;
}
}
代码实现 - 总天数相减
class Solution {
public int daysBetweenDates(String date1, String date2) {
return Math.abs(toDays(date1) - toDays(date2));
}
private int toDays(String date) {
int count = 0;
String[] s = date.split("-");
int y = Integer.parseInt(s[0]), m = Integer.parseInt(s[1]), d = Integer.parseInt(s[2]);
int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
days[2] += isLeapYear(y) ? 1 : 0;
for (int i = 1970; i < y; i++) {
count += isLeapYear(i) ? 366 : 365;
}
count += d;
for (int i = 1; i < m; i++) {
count += days[i];
}
return count;
}
private boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
}