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
1971and2100.
题意
计算两个日期之间的天数。
思路
几种方法:
- 直接调用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;}}
