方法定义

public int compareTo(Date anotherDate)

功能说明

  • 比较两个 Date 对象的时间先后顺序
  • 返回值:
    • 负数:当前日期在 anotherDate 之前
    • 0:两日期相等
    • 正数:当前日期在 anotherDate 之后
  • 底层基于时间戳(毫秒值)比较,等同于 getTime() - anotherDate.getTime()

示例代码

import java.util.Date;

public class DateComparison {
    public static void main(String[] args) {
        Date date1 = new Date(1620000000000L); // 2021-05-03
        Date date2 = new Date(1630000000000L); // 2021-08-27

        int result = date1.compareTo(date2);
        System.out.println(result);  // 输出: -1 (date1 在 date2 之前)

        // 判断日期顺序
        if (result < 0) {
            System.out.println("date1 在 date2 之前");
        } else if (result > 0) {
            System.out.println("date1 在 date2 之后");
        } else {
            System.out.println("两日期相等");
        }
    }
}

使用技巧

  1. 排序日期集合
    List<Date> dates = new ArrayList<>();
    // 添加日期...
    Collections.sort(dates); // 内部使用 compareTo 升序排序
    
  2. 自定义排序逻辑
    dates.sort((d1, d2) -> d2.compareTo(d1)); // 降序排序
    

常见错误 & 注意事项

  1. 空指针异常(NPE)

    Date date = null;
    date.compareTo(new Date()); // 抛出 NullPointerException
    

    修复:确保被比较对象非空:

    if (date != null) {
        date.compareTo(anotherDate);
    }
    
  2. 精度问题

    • Date 精确到毫秒,毫秒级差异会导致比较结果不同。
    • 若需忽略毫秒,使用 java.time API(Java 8+):
      Instant instant1 = date1.toInstant().truncatedTo(ChronoUnit.SECONDS);
      Instant instant2 = date2.toInstant().truncatedTo(ChronoUnit.SECONDS);
      int result = instant1.compareTo(instant2);
      
  3. 时区陷阱

    • Date 存储 UTC 时间戳,但构造时可能受默认时区影响。
    • 建议统一使用 java.time.ZonedDateTime 处理时区。

最佳实践 & 性能优化

  1. 优先使用 java.time API(Java 8+):

    LocalDateTime dt1 = LocalDateTime.of(2021, 5, 3, 0, 0);
    LocalDateTime dt2 = LocalDateTime.of(2021, 8, 27, 0, 0);
    int result = dt1.compareTo(dt2); // 更安全、功能更丰富
    
  2. 避免重复比较

    • 多次比较时,先获取时间戳减少开销:
      long ts1 = date1.getTime();
      long ts2 = date2.getTime();
      if (ts1 < ts2) { ... } // 比多次调用 compareTo 高效
      
  3. 线程安全

    • Date 是可变对象,多线程环境下需同步访问:
      synchronized (date) {
          date.compareTo(anotherDate);
      }
      
    • 或改用不可变类(如 Instant)。