记录一线上问题,编辑会员卡信息,有效期截止时间由2022-04-17修改为2023-04-18,操作成功之后显示剩余的有效天数为24天,实际上怎么也得有三百多天.之前本地测试一直没有问题,现将定位过程记录一下.
本地复测之后发现计算的是24天,果然有问题.
Period period = Period.between(LocalDate.now(), LocalDate.parse("2023-03-14",DateTimeFormatter.ofPattern(DateTimeUtil.PATTERN_THREE)));System.out.println(String.valueOf(period.getDays()));// 输出获取间隔日天数为24
看一下实现的源码发现问题所在,确实还是用之前没有了解清楚api的用法.Period.between(LocalDate startDateInclusive, LocalDate endDateExclusive)
最终调用的是LocalDate.java中until(ChronoLocalDate endDateExclusive)
,源码如下:
Period.between计算两个日期间隔是按照年月日来计算,可以理解为2023-03-14和2022-04-18差0年,10个月,24天;故此处天数非换算后的天数。
可以使用LocalDate.java中until(Temporal endExclusive, TemporalUnit unit)
进行替换
LocalDate nowLocalDate = LocalDate.now();LocalDate localDate = LocalDate.of(2023, 03, 14);long until = nowLocalDate.until(localDate, ChronoUnit.DAYS);System.out.println(until ); //获取间隔的天数为330
总结:时间计算间隔可以使用LocalDate中until的两个方法进行处理。
Period until(ChronoLocalDate endDateExclusive);
long until(Temporal endExclusive, TemporalUnit unit)
前者支持年月日同一维度同时统计(相差几年几个月几天);后者支持指定单位(按年或按月或按天)分别统计,后者更加灵活。
LocalDate 跨年快速计算月差
LocalDate date = LocalDate.now();
LocalDate time = LocalDate.now();
Integer diff = time.getYear() - date.getYear();
Integer month = (time.getMonthValue() - date.getMonthValue()) + (diff *12);
LocalDate,LocalDateTime计算两个时间的相差时间
LcoalDateTime
LocalDateTime now = LocalDateTime.now();
LocalDateTime end = LocalDateTime.now();Duration duration = Duration.between(now,end);
//相差的天数
long days = duration.toDays();
//相差的小时数
long hours = duration.toHours();
//相差的分钟数
long minutes = duration.toMinutes();
//相差毫秒数
long millis = duration.toMillis();
//相差的纳秒数
long nanos = duration.toNanos();
LocalDate
LocalDate start = LocalDate.of(2020, 12, 27);
Period period = Period.between(start, LocalDate.now());
// 日期相差
int days = period.getDays();
// 相差月份
int months = period.getMonths();
// 相差年份
int years = period.getYears();
System.out.println(days +"-"+ months +"-"+ years);
// 更准确 - 开发用这个,省事
long dayse = LocalDate.now().toEpochDay() - start.toEpochDay();
System.out.println("相差天数" + dayse);