LocalDate时间计算

plus - 按给定数量增加日期值

1. plus(long amountToAdd, TemporalUnit unit): 通过增加给定的数量返回LocalDate实例。

  1. import java.time.LocalDate;
  2. import java.time.temporal.ChronoUnit;
  3. public class LocalDateDemo {
  4. public static void main(String[] args) {
  5. LocalDate localDate1 = LocalDate.now();
  6. System.out.println(localDate1);
  7. LocalDate localDate2 = localDate1.plus(15, ChronoUnit.DAYS);
  8. System.out.println(localDate2);
  9. }
  10. }

输出

  1. 2021-06-13
  2. 2021-06-28

在上面的例子中,我们在当前日期中增加了15天。

2. plus(TemporalAmount amountToAdd): 通过添加指定的TemporalAmount返回LocalDate实例。

  1. LocalDate localDate1 = LocalDate.now();
  2. System.out.println(localDate1);
  3. LocalDate localDate2 = localDate1.plus(Period.ofDays(15));
  4. System.out.println(localDate2);

输出

  1. 2021-06-13
  2. 2021-06-28

在上面的代码中,我们给localDate1增加了15天,得到localDate2作为LocalDate的实例。

3. plusDays(long daysToAdd): 通过添加指定的天数返回LocalDate实例。

  1. LocalDate localDate1 = LocalDate.parse("2018-11-05");
  2. LocalDate localDate2 = localDate1.plusDays(15);
  3. System.out.println(localDate2);

输出为2018-11-20

4. plusWeeks(long weeksToAdd): 通过添加指定的周数返回 LocalDate 实例,用法与plusDays类似。

5. plusMonths(long monthsToAdd): 通过添加指定的月数返回 LocalDate 实例,用法与plusDays类似。

注意如果是大月的最后一天加一个月到小月的话,会自动调整到这个小月的最后一天:

  1. public static LocalDate String2LocalDate(String str){
  2. return LocalDate.parse(str.substring(0,10), DateTimeFormatter.ISO_LOCAL_DATE);
  3. }
  4. LocalDate d1 = String2LocalDate("2022-01-31");
  5. System.out.println("2022-01-31加一个月的月份为:"+d1.plusMonths(1));

输出

  1. 2022-01-31加一个月的月份为:2022-02-28

6. plusYears(long yearsToAdd): ,通过添加指定的年数返回 LocalDate 实例,用法与plusDays类似。

注意如果是闰年的2-29加一年到第二年的话会为2-28:

  1. LocalDate d3 = String2LocalDate("2020-02-29");
  2. System.out.println("2020-02-29加一年的日期为:"+d3.plusYears(1));

输出:

  1. 2020-02-29加一年的日期为:2021-02-28

minus - 按给定数量减去日期值

1. minus(long amountToSubtract, TemporalUnit unit): 通过减去给定的数量返回LocalDate实例。

  1. import java.time.LocalDate;
  2. import java.time.temporal.ChronoUnit;
  3. public class LocalDateDemo {
  4. public static void main(String[] args) {
  5. LocalDate localDate1 = LocalDate.now();
  6. System.out.println(localDate1);
  7. LocalDate localDate2 = localDate1.minus(15, ChronoUnit.DAYS);
  8. System.out.println(localDate2);
  9. }
  10. }

输出

  1. 2018-12-02
  2. 2018-11-17

在上面的例子中,我们在当前日期中减少了15天。

2. minus(TemporalAmount amountToSubtract): 通过减去指定的TemporalAmount返回LocalDate实例。

  1. LocalDate localDate1 = LocalDate.now();
  2. System.out.println(localDate1);
  3. LocalDate localDate2 = localDate1.minus(Period.ofDays(15));
  4. System.out.println(localDate2);

输出

  1. 2018-12-02
  2. 2018-11-17

在上面的代码中,我们给localDate1减少了15天,得到localDate2作为LocalDate的实例。

3. minusDays(long daysToSubtract): 通过减少指定的天数返回LocalDate实例。

  1. LocalDate localDate1 = LocalDate.parse("2018-11-05");
  2. LocalDate localDate2 = localDate1.minusDays(15);
  3. 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): 检查此日期是否等于给定日期。

示例

  1. import java.time.LocalDate;
  2. public class LocalDateDemo {
  3. public static void main(String[] args) {
  4. LocalDate localDate1 = LocalDate.parse("2018-03-18");
  5. LocalDate localDate2 = LocalDate.parse("2018-05-12");
  6. System.out.println(localDate1.isAfter(localDate2));
  7. System.out.println(localDate1.isBefore(localDate2));
  8. System.out.println(localDate1.isEqual(localDate2));
  9. }
  10. }

输出

  1. false
  2. true
  3. false

LocalDate compareTo() and equals() 比较日期

compareTo(ChronoLocalDate other): 将此日期与指定日期进行比较。
equals(Object obj): 检查此日期是否等于指定日期。

示例

  1. LocalDate localDate = LocalDate.parse("2018-02-18");
  2. System.out.println(localDate.equals(LocalDate.parse("2018-02-18")));
  3. System.out.println(localDate.compareTo(LocalDate.parse("2018-02-25")));

输出

  1. true
  2. -7

获取两日期之间时间段

LocalDate datesUntil() 返回指定时间段

Java 9 中引入了LocalDate 中的datesUntil 方法。datesUntil 方法返回不包括给定日期的有序的日期流。

我们也可以通过 period 来设置增量步长。我们获取从该日期开始到指定日期的日期流。指定的日期将被排除在结果中。

dateUntil 声明如下。

  1. Stream<LocalDate> datesUntil(LocalDate endExclusive)
  2. Stream<LocalDate> datesUntil(LocalDate endExclusive, Period step)

示例

  1. import java.time.LocalDate;
  2. import java.time.Period;
  3. import java.util.stream.Stream;
  4. public class LocalDateDemo {
  5. public static void main(String[] args) {
  6. LocalDate localDate = LocalDate.parse("2018-02-18");
  7. System.out.println("--- With LocalDate ---");
  8. Stream<LocalDate> localDateStream = localDate.datesUntil(LocalDate.parse("2018-02-22"));
  9. localDateStream.forEach(date -> System.out.println(date));
  10. System.out.println("--- With LocalDate and Period ---");
  11. localDateStream = localDate.datesUntil(LocalDate.parse("2018-02-22"), Period.ofDays(2));
  12. localDateStream.forEach(date -> System.out.println(date));
  13. }
  14. }

输出

  1. --- With LocalDate ---
  2. 2018-02-18
  3. 2018-02-19
  4. 2018-02-20
  5. 2018-02-21
  6. --- With LocalDate and Period ---
  7. 2018-02-18
  8. 2018-02-20

LocalDate until() 计算两个日期之间的时间量

  1. 计算此日期和指定日期之间的时期为Period
  1. Period until(ChronoLocalDate endDateExclusive)
  1. 计算距指定日期(不包括)的时间量。
  1. long until(Temporal endExclusive, TemporalUnit unit)

示例

  1. import java.time.LocalDate;
  2. import java.time.Period;
  3. import java.time.temporal.ChronoUnit;
  4. public class LocalDateDemo {
  5. public static void main(String[] args) {
  6. LocalDate localDate = LocalDate.parse("2018-02-18");
  7. Period period = localDate.until(LocalDate.parse("2018-03-28"));
  8. System.out.println(period.getDays());
  9. long val = localDate.until(LocalDate.parse("2018-03-28"), ChronoUnit.DAYS);
  10. System.out.println(val);
  11. }
  12. }

输出

  1. 10
  2. 38

注意这里算月份的话如果是大月最后一天到小月最后一天,是不算一个月的

  1. import java.time.LocalDate;
  2. import java.time.Period;
  3. import java.time.temporal.ChronoUnit;
  4. public class LocalDateDemo {
  5. public static void main(String[] args) {
  6. LocalDate localDate = LocalDate.parse("2018-03-31");
  7. Period period = localDate.until(LocalDate.parse("2018-02-28"));
  8. System.out.println(period.getMonths());
  9. }
  10. }

输出:

  1. 0

ChronoUnit计算两个日期之间时间量

示例

  1. public static long jdkMonthIntervals(String s1, String s2){
  2. LocalDate d1 = String2LocalDate("2022-01-31");
  3. LocalDate d2 = String2LocalDate("2022-02-28");
  4. return ChronoUnit.MONTHS.between(d1,d2);
  5. }
  6. long interval = jdkMonthIntervals("2022-01-31","2022-02-28");
  7. System.out.println("2022-01-31到2022-02-28相差月份为:"+interval);
  8. LocalDate d1 = String2LocalDate("2022-02-28");
  9. LocalDate d2 = String2LocalDate("2022-03-28");
  10. interval = ChronoUnit.MONTHS.between(d1,d2);
  11. System.out.println("=========================");
  12. 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

参考文档

JAVA 8 时间类库与JodaTime Enum ChronoUnit