常见的错误做法!!!
比如获取相差月:使用Period.between(date1,date2).getMonth()
1 2 3 4 5 6 7 | LocalDate date1 = LocalDate.of( 2022 , 2 , 10 ); LocalDate date2 = LocalDate.of( 2022 , 3 , 8 ); LocalDate date3 = LocalDate.of( 2022 , 1 , 20 ); LocalDate date4 = LocalDate.of( 2020 , 1 , 20 ); System.out.println(Period.between(date1, date2).getMonths()); System.out.println(Period.between(date3, date1).getMonths()); System.out.println(Period.between(date4, date1).getMonths()); |
输出值:0 0 0
,显然不是我们想要的。
正确做法
1 2 3 4 5 6 7 8 9 10 11 | LocalDate date1 = LocalDate.of( 2022 , 2 , 10 ); LocalDate date2 = LocalDate.of( 2020 , 1 , 20 ); //年差 int years = date1.getYear() - date2.getYear(); //月差 int months = years * 12 + (date1.getMonthValue() - date2.getMonthValue()); //天差 long days = date1.toEpochDay() - date2.toEpochDay(); System.out.println(years); System.out.println(months); System.out.println(days); |
startDate.until(endDate, ChronoUnit.DAYS))
示例1:这是获取两个指定日期天数间隔的逻辑
1 2 3 4 5 | DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd" ); LocalDate oneDay= LocalDate.parse( "2022-07-23" , dateTimeFormatter); LocalDate twoDay= LocalDate.parse( "2022-06-23" , dateTimeFormatter); long until = twoDay.until(oneDay, ChronoUnit.DAYS); System.out.println(until); //得到的结果是30 |
示例2:这是获取一个指定日期和当前时间天数间隔的逻辑
1 2 3 4 5 | LocalDate now = LocalDate.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd" ); LocalDate oneDay= LocalDate.parse( "2022-06-23" , dateTimeFormatter); long until = oneDay.until(now, ChronoUnit.DAYS); System.out.println(until); |
JDK 8 如何通过 LocalDate 计算两个日期相差的天数
JDK 8 提供了新的日期类 LocalDate
,通过 LocalDate
可以轻松的对日期进行操作,在实际的开发过程中也会经常需要计算两个日期相差的天数。
一个简单的示例:
1 2 3 4 5 6 7 8 9 | // 指定转换格式 DateTimeFormatter fmt = DateTimeFormatter.ofPattern( "yyyy-MM-dd" ); LocalDate startDate = LocalDate.parse( "2019-03-01" ,fmt); LocalDate endDate = LocalDate.parse( "2020-04-02" ,fmt); System.out.println( "总相差的天数:" + startDate.until(endDate, ChronoUnit.DAYS)); System.out.println( "总相差的月数:" + startDate.until(endDate, ChronoUnit.MONTHS)); System.out.println( "总相差的年数:" + startDate.until(endDate, ChronoUnit.YEARS)); |
输出结果:
1 2 3 | 总相差的天数:398 总相差的月数:13 总相差的年数:1 |
【拓展】
使用 LocalDate
自带的 until()
方法计算的是总的相差的年数、月数与天数,如果想年月日单独计算的就要使用 Period 类,比如上面的 2019-03-01
与 2020-04-02
的日期差为: 1 年 1 个月 1 天
,相关代码如下:
1 2 3 4 5 6 7 8 | //指定转换格式 DateTimeFormatter fmt = DateTimeFormatter.ofPattern( "yyyy-MM-dd" ); LocalDate startDate = LocalDate.parse( "2019-03-01" , fmt); LocalDate endDate = LocalDate.parse( "2020-04-02" , fmt); Period period = Period.between(startDate, endDate); System.out.println( "相差:" +period.getYears() + " 年 " + period.getMonths() + " 个月 " + period.getDays() + " 天" ); |
输出结果:
1 | 相差:1 年 1 个月 1 天 |
【注意】
在实际的使用中要区分要这两种情况,否则将会出现问题。