方法定义
// 检查当前日期是否在指定日期之前
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年内");
}
使用技巧
日期范围验证(开区间):
boolean isWithinRange = date.isAfter(start) && date.isBefore(end);
闭区间检查(包含边界):
boolean isInclusive = !date.isBefore(start) && !date.isAfter(end);
结合
equals()
处理边界:boolean isBeforeOrEqual = date.isBefore(other) || date.equals(other);
链式比较:
boolean isValid = startDate.isBefore(endDate) && endDate.isBefore(deadline);
常见错误与注意事项
空指针异常:
LocalDate nullDate = null; today.isBefore(nullDate); // 抛出 NullPointerException
时区混淆:
// 错误:比较不同时区的日期(应使用 ZonedDateTime) LocalDate nyDate = LocalDate.now(ZoneId.of("America/New_York")); LocalDate londonDate = LocalDate.now(ZoneId.of("Europe/London")); nyDate.isBefore(londonDate); // 结果可能意外(因时区差异)
忽略相等情况:
// 错误:遗漏相等场景 if (startDate.isBefore(endDate)) { // 当 startDate == endDate 时不会执行 }
混合日期类型:
LocalDateTime dateTime = LocalDateTime.now(); today.isBefore(dateTime); // 编译错误!需使用 toLocalDate()
最佳实践与性能优化
优先使用 ISO 比较:
// 比手动比较年/月/日更高效 boolean valid = date1.isBefore(date2);
缓存频繁使用的日期:
// 避免重复创建对象 private static final LocalDate CUTOFF = LocalDate.of(2025, 12, 31); public boolean isValid(LocalDate date) { return date.isBefore(CUTOFF); }
结合时间类使用:
// 需要时间比较时使用 LocalDateTime LocalDateTime timestamp = LocalDateTime.now(); if (timestamp.isAfter(deadline.atStartOfDay())) { // 处理超时 }
闰年自动处理:
LocalDate leapDay = LocalDate.of(2024, 2, 29); leapDay.isAfter(LocalDate.of(2024, 2, 28)); // true(无需手动处理闰年)
总结
场景 | 推荐方法 |
---|---|
严格早于检查 | isBefore() |
严格晚于检查 | isAfter() |
包含边界的范围检查 | !isBefore() && !isAfter() |
忽略时间的日期比较 | LocalDate 而非 LocalDateTime |
核心要点:
- 所有比较基于 ISO-8601 日历系统
- 方法具有 原子性 和 线程安全性
- 性能高效(时间复杂度 O(1))
- 使用模式:
if (targetDate.isAfter(threshold)) { // 执行未来逻辑 } else if (targetDate.isBefore(threshold)) { // 执行过去逻辑 } else { // 处理相等情况 }