LocalDate时间计算
plus - 按给定数量增加日期值
1. plus(long amountToAdd, TemporalUnit unit): 通过增加给定的数量返回LocalDate实例。
import java.time.LocalDate;import java.time.temporal.ChronoUnit;public class LocalDateDemo {public static void main(String[] args) {LocalDate localDate1 = LocalDate.now();System.out.println(localDate1);LocalDate localDate2 = localDate1.plus(15, ChronoUnit.DAYS);System.out.println(localDate2);}}
输出
2021-06-132021-06-28
在上面的例子中,我们在当前日期中增加了15天。
2. plus(TemporalAmount amountToAdd): 通过添加指定的TemporalAmount返回LocalDate实例。
LocalDate localDate1 = LocalDate.now();System.out.println(localDate1);LocalDate localDate2 = localDate1.plus(Period.ofDays(15));System.out.println(localDate2);
输出
2021-06-132021-06-28
在上面的代码中,我们给localDate1增加了15天,得到localDate2作为LocalDate的实例。
3. plusDays(long daysToAdd): 通过添加指定的天数返回LocalDate实例。
LocalDate localDate1 = LocalDate.parse("2018-11-05");LocalDate localDate2 = localDate1.plusDays(15);System.out.println(localDate2);
输出为2018-11-20。
4. plusWeeks(long weeksToAdd): 通过添加指定的周数返回 LocalDate 实例,用法与plusDays类似。
5. plusMonths(long monthsToAdd): 通过添加指定的月数返回 LocalDate 实例,用法与plusDays类似。
注意如果是大月的最后一天加一个月到小月的话,会自动调整到这个小月的最后一天:
public static LocalDate String2LocalDate(String str){return LocalDate.parse(str.substring(0,10), DateTimeFormatter.ISO_LOCAL_DATE);}LocalDate d1 = String2LocalDate("2022-01-31");System.out.println("2022-01-31加一个月的月份为:"+d1.plusMonths(1));
输出
2022-01-31加一个月的月份为:2022-02-28
6. plusYears(long yearsToAdd): ,通过添加指定的年数返回 LocalDate 实例,用法与plusDays类似。
注意如果是闰年的2-29加一年到第二年的话会为2-28:
LocalDate d3 = String2LocalDate("2020-02-29");System.out.println("2020-02-29加一年的日期为:"+d3.plusYears(1));
输出:
2020-02-29加一年的日期为:2021-02-28
minus - 按给定数量减去日期值
1. minus(long amountToSubtract, TemporalUnit unit): 通过减去给定的数量返回LocalDate实例。
import java.time.LocalDate;import java.time.temporal.ChronoUnit;public class LocalDateDemo {public static void main(String[] args) {LocalDate localDate1 = LocalDate.now();System.out.println(localDate1);LocalDate localDate2 = localDate1.minus(15, ChronoUnit.DAYS);System.out.println(localDate2);}}
输出
2018-12-022018-11-17
在上面的例子中,我们在当前日期中减少了15天。
2. minus(TemporalAmount amountToSubtract): 通过减去指定的TemporalAmount返回LocalDate实例。
LocalDate localDate1 = LocalDate.now();System.out.println(localDate1);LocalDate localDate2 = localDate1.minus(Period.ofDays(15));System.out.println(localDate2);
输出
2018-12-022018-11-17
在上面的代码中,我们给localDate1减少了15天,得到localDate2作为LocalDate的实例。
3. minusDays(long daysToSubtract): 通过减少指定的天数返回LocalDate实例。
LocalDate localDate1 = LocalDate.parse("2018-11-05");LocalDate localDate2 = localDate1.minusDays(15);System.out.println(localDate2);
输出为2018-10-21。
4. minusWeeks(long weeksToSubtract): 通过减少指定的周数返回 LocalDate 实例,用法与minusDays相似。
5. minusMonths(long monthsToSubtract): 通过减少指定的月数返回 LocalDate 实例,用法与minusDays相似。
6. minusYears(long yearsToSubtract): ,通过减少指定的年数返回 LocalDate 实例,用法与minusDays相似。
LocalDate日期比较
LocalDate isAfter(), isBefore() and isEqual() 比较日期
isAfter(ChronoLocalDate other): 检查此日期是否在给定日期之后。isBefore(ChronoLocalDate other): 检查此日期是否在给定日期之前。isEqual(ChronoLocalDate other): 检查此日期是否等于给定日期。
示例
import java.time.LocalDate;public class LocalDateDemo {public static void main(String[] args) {LocalDate localDate1 = LocalDate.parse("2018-03-18");LocalDate localDate2 = LocalDate.parse("2018-05-12");System.out.println(localDate1.isAfter(localDate2));System.out.println(localDate1.isBefore(localDate2));System.out.println(localDate1.isEqual(localDate2));}}
输出
falsetruefalse
LocalDate compareTo() and equals() 比较日期
compareTo(ChronoLocalDate other): 将此日期与指定日期进行比较。
equals(Object obj): 检查此日期是否等于指定日期。
示例
LocalDate localDate = LocalDate.parse("2018-02-18");System.out.println(localDate.equals(LocalDate.parse("2018-02-18")));System.out.println(localDate.compareTo(LocalDate.parse("2018-02-25")));
输出
true-7
获取两日期之间时间段
LocalDate datesUntil() 返回指定时间段
Java 9 中引入了LocalDate 中的datesUntil 方法。datesUntil 方法返回不包括给定日期的有序的日期流。
我们也可以通过 period 来设置增量步长。我们获取从该日期开始到指定日期的日期流。指定的日期将被排除在结果中。
dateUntil 声明如下。
Stream<LocalDate> datesUntil(LocalDate endExclusive)Stream<LocalDate> datesUntil(LocalDate endExclusive, Period step)
示例
import java.time.LocalDate;import java.time.Period;import java.util.stream.Stream;public class LocalDateDemo {public static void main(String[] args) {LocalDate localDate = LocalDate.parse("2018-02-18");System.out.println("--- With LocalDate ---");Stream<LocalDate> localDateStream = localDate.datesUntil(LocalDate.parse("2018-02-22"));localDateStream.forEach(date -> System.out.println(date));System.out.println("--- With LocalDate and Period ---");localDateStream = localDate.datesUntil(LocalDate.parse("2018-02-22"), Period.ofDays(2));localDateStream.forEach(date -> System.out.println(date));}}
输出
--- With LocalDate ---2018-02-182018-02-192018-02-202018-02-21--- With LocalDate and Period ---2018-02-182018-02-20
LocalDate until() 计算两个日期之间的时间量
- 计算此日期和指定日期之间的时期为
Period
Period until(ChronoLocalDate endDateExclusive)
- 计算距指定日期(不包括)的时间量。
long until(Temporal endExclusive, TemporalUnit unit)
示例
import java.time.LocalDate;import java.time.Period;import java.time.temporal.ChronoUnit;public class LocalDateDemo {public static void main(String[] args) {LocalDate localDate = LocalDate.parse("2018-02-18");Period period = localDate.until(LocalDate.parse("2018-03-28"));System.out.println(period.getDays());long val = localDate.until(LocalDate.parse("2018-03-28"), ChronoUnit.DAYS);System.out.println(val);}}
输出
1038
注意这里算月份的话如果是大月最后一天到小月最后一天,是不算一个月的。
import java.time.LocalDate;import java.time.Period;import java.time.temporal.ChronoUnit;public class LocalDateDemo {public static void main(String[] args) {LocalDate localDate = LocalDate.parse("2018-03-31");Period period = localDate.until(LocalDate.parse("2018-02-28"));System.out.println(period.getMonths());}}
输出:
0
ChronoUnit计算两个日期之间时间量
示例
public static long jdkMonthIntervals(String s1, String s2){LocalDate d1 = String2LocalDate("2022-01-31");LocalDate d2 = String2LocalDate("2022-02-28");return ChronoUnit.MONTHS.between(d1,d2);}long interval = jdkMonthIntervals("2022-01-31","2022-02-28");System.out.println("2022-01-31到2022-02-28相差月份为:"+interval);LocalDate d1 = String2LocalDate("2022-02-28");LocalDate d2 = String2LocalDate("2022-03-28");interval = ChronoUnit.MONTHS.between(d1,d2);System.out.println("=========================");System.out.println("2022-02-28到2022-03-28相差月份为:"+interval);
结果
2022-01-31到2022-02-28相差月份为:0
=========================
2022-02-28到2022-03-28相差月份为:1
注意这里算月份的话如果是大月最后一天到小月最后一天,会少一个月。
joda 计算俩日期之差
但是如果使用第三方库joda日期工具的话,则不会少一天!
pom
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.6</version>
</dependency>
示例
public static int jodaMonthIntervals(String d1, String d2){
org.joda.time.format.DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime start = formatter.parseDateTime(d1);
DateTime end = formatter.parseDateTime(d2);
return Months.monthsBetween(start, end).getMonths();
}
int months = jodaMonthIntervals("2022-01-31", "2022-02-28");
System.out.println("jada计算2022-01-31到2022-02-28相差月份"+months);
结果
jada计算2022-01-31到2022-02-28相差月份1
因此。如果localDate想要实现joda这种结果,参考:https://stackoverflow.com/questions/48950145/java-8-calculate-months-between-two-dates
