Date的compareTo()按时间戳毫秒值比较两个Date对象,返回负数、0或正数表示先后关系;内部调用getTime()做减法运算,不依赖时区;参数为null抛NullPointerException;推荐优先使用java.time包中的Instant或LocalDateTime等现代API。

Date 的 compareTo() 方法用于按时间顺序比较两个 Date 对象,返回一个整数表示大小关系:负数表示当前对象早于参数,0 表示相等,正数表示当前对象晚于参数。
compareTo 的比较逻辑
该方法内部调用 getTime() 获取毫秒值(自 1970-01-01 00:00:00 UTC 起的 long 值),然后对两个 long 值做减法运算:
return (this.getTime() > anotherDate.getTime()) ? 1 : ((this.getTime() == anotherDate.getTime()) ? 0 : -1);
注意:它不依赖时区或格式化,只比原始时间戳。
使用注意事项
- 参数为 null 时会抛出 NullPointerException,调用前需判空
- 返回值不是固定 -1/0/1,而是符合 Comparable 接口规范:只要符号正确即可(如 -5、0、12 都合法)
- 推荐优先使用 java.time 类(如 LocalDateTime、ZonedDateTime),因为 Date 已基本被标记为遗留类
简单示例
Date d1 = new Date(1000L); // 1970-01-01 00:00:01 Date d2 = new Date(2000L); // 1970-01-01 00:00:02 System.out.println(d1.compareTo(d2)); // 输出 -1 System.out.println(d2.compareTo(d1)); // 输出 1 System.out.println(d1.compareTo(d1)); // 输出 0
替代方案建议
如果项目允许,改用现代时间 API 更安全清晰:
- Instant:直接对应时间戳,支持 compareTo() 且线程安全
- LocalDateTime:适合无时区场景,也实现 Comparable
- 避免混用 Date 和 Calendar,容易引发时区和可变性问题


















