date类的before()和after()方法用于判断两个非null日期的严格先后顺序,返回boolean值且互为反向;相等时均返回false,需空值检查;compareto()可三值比较,更适用于需区分早于、等于、晚于的场景;date基于utc毫秒戳,比较不受时区影响但解析时需注意时区设置。

Date 类的 before() 和 after() 方法是判断两个日期先后顺序的便捷方式,但需注意它们只适用于非 null 对象,且逻辑上互为反向关系。
before() 和 after() 的基本用法
这两个方法返回 boolean 值:
-
date1.before(date2)→ 如果date1在时间线上严格早于date2,返回true -
date1.after(date2)→ 如果date1在时间线上严格晚于date2,返回true - 两者都不处理相等的情况 —— 若两日期相等,两个方法都返回
false
必须避免 null 引用
调用 before() 或 after() 前,务必确保两个 Date 对象都不为 null,否则会抛出 NullPointerException:
- 建议先做空值检查,例如:
date1 != null && date2 != null && date1.before(date2) - 也可用
Objects.nonNull()配合使用(Java 7+)
与 compareTo() 的区别和选择
Date 还实现了 Comparable 接口,支持 compareTo() 方法,它能三值判断(负数/0/正数),更适合需要区分“早于、等于、晚于”的场景:
date1.compareTo(date2) 等价于 <code>date1.before(date2)-
date1.compareTo(date2) > 0等价于date1.after(date2) -
date1.compareTo(date2) == 0表示两个日期相等(毫秒值相同)
注意时区和精度问题
Date 本质是毫秒时间戳(自 1970-01-01 00:00:00 UTC 起),不包含时区信息:
- 比较的是绝对时间点,不受本地时区影响
- 但构造
Date时若用SimpleDateFormat解析字符串,需注意其默认时区,否则可能因时区误解导致比较结果不符预期 - 例如:同一字符串在不同时区解析出不同毫秒值,再比较就失去意义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











