方法定义

// 检查当前日期是否在指定日期之前
public boolean isBefore(ChronoLocalDate other)

// 检查当前日期是否在指定日期之后
public boolean isAfter(ChronoLocalDate other)

功能说明

方法 返回值 描述
isBefore() boolean 当前日期 严格早于 参数日期
isAfter() boolean 当前日期 严格晚于 参数日期

关键特性

  • 严格比较:相等日期返回 false
  • 空安全:参数为 null 时抛出 NullPointerException
  • 跨年支持:自动处理年份边界(如 2023-12-31 和 2024-01-01)

示例代码

LocalDate christmas = LocalDate.of(2023, 12, 25);
LocalDate newYear = LocalDate.of(2024, 1, 1);

// 基础比较
boolean before = christmas.isBefore(newYear);  // true
boolean after = newYear.isAfter(christmas);    // true

// 相等场景
LocalDate sameDate = LocalDate.of(2023, 12, 25);
christmas.isBefore(sameDate);  // false
christmas.isAfter(sameDate);   // false

// 日期范围检查
LocalDate today = LocalDate.now();
LocalDate start = LocalDate.of(2023, 1, 1);
LocalDate end = LocalDate.of(2023, 12, 31);

if (today.isAfter(start) && today.isBefore(end)) {
    System.out.println("当前日期在2023年内");
}

使用技巧

  1. 日期范围验证(开区间):

    boolean isWithinRange = date.isAfter(start) && date.isBefore(end);
    
  2. 闭区间检查(包含边界):

    boolean isInclusive = !date.isBefore(start) && !date.isAfter(end);
    
  3. 结合equals()处理边界

    boolean isBeforeOrEqual = date.isBefore(other) || date.equals(other);
    
  4. 链式比较

    boolean isValid = startDate.isBefore(endDate) 
                     && endDate.isBefore(deadline);
    

常见错误与注意事项

  1. 空指针异常

    LocalDate nullDate = null;
    today.isBefore(nullDate); // 抛出 NullPointerException
    
  2. 时区混淆

    // 错误:比较不同时区的日期(应使用 ZonedDateTime)
    LocalDate nyDate = LocalDate.now(ZoneId.of("America/New_York"));
    LocalDate londonDate = LocalDate.now(ZoneId.of("Europe/London"));
    nyDate.isBefore(londonDate); // 结果可能意外(因时区差异)
    
  3. 忽略相等情况

    // 错误:遗漏相等场景
    if (startDate.isBefore(endDate)) { 
       // 当 startDate == endDate 时不会执行
    }
    
  4. 混合日期类型

    LocalDateTime dateTime = LocalDateTime.now();
    today.isBefore(dateTime); // 编译错误!需使用 toLocalDate()
    

最佳实践与性能优化

  1. 优先使用 ISO 比较

    // 比手动比较年/月/日更高效
    boolean valid = date1.isBefore(date2);
    
  2. 缓存频繁使用的日期

    // 避免重复创建对象
    private static final LocalDate CUTOFF = LocalDate.of(2025, 12, 31);
    
    public boolean isValid(LocalDate date) {
        return date.isBefore(CUTOFF);
    }
    
  3. 结合时间类使用

    // 需要时间比较时使用 LocalDateTime
    LocalDateTime timestamp = LocalDateTime.now();
    if (timestamp.isAfter(deadline.atStartOfDay())) {
        // 处理超时
    }
    
  4. 闰年自动处理

    LocalDate leapDay = LocalDate.of(2024, 2, 29);
    leapDay.isAfter(LocalDate.of(2024, 2, 28)); // true(无需手动处理闰年)
    

总结

场景 推荐方法
严格早于检查 isBefore()
严格晚于检查 isAfter()
包含边界的范围检查 !isBefore() && !isAfter()
忽略时间的日期比较 LocalDate 而非 LocalDateTime

核心要点

  1. 所有比较基于 ISO-8601 日历系统
  2. 方法具有 原子性线程安全性
  3. 性能高效(时间复杂度 O(1))
  4. 使用模式:
    if (targetDate.isAfter(threshold)) {
        // 执行未来逻辑
    } else if (targetDate.isBefore(threshold)) {
        // 执行过去逻辑
    } else {
        // 处理相等情况
    }