应根据业务需求选择localdate(仅日期)或localdatetime(日期+时间)进行比较:localdate适用于报名截止等场景,用isbefore/isafter判断;localdatetime适用于维护窗口等需精确到时分的场景,用isafter/isbefore组合判断区间;数据库优先用jdbc 4.2+直接获取localdatetime,避免旧date转换问题。

直接看核心逻辑:判断当前日期是否在指定范围之前或之后,关键在于明确比较对象——是只比“日期”(年月日),还是带“时间”(年月日时分秒),选对类型才能不出错。
只比年月日:用 LocalDate 最稳
适合活动报名截止、合同生效日这类不关心具体几点的场景。LocalDate 专为纯日期设计,没有时区和时间干扰。
- 把字符串转成 LocalDate,比如 "2026-04-10" →
LocalDate.parse("2026-04-10") - 获取今天:
LocalDate.now() - 判断是否在某天之前:
LocalDate.now().isBefore(targetDate) - 判断是否在某天之后:
LocalDate.now().isAfter(targetDate) - 如果要判断是否在两个日期之间(含边界):
!today.isBefore(start) && !today.isAfter(end)
要精确到小时分钟:用 LocalDateTime
比如系统维护窗口、直播开始时间,必须带时间点。LocalDateTime 同时包含日期和时间,但不带时区信息,适合本地业务逻辑。
- 格式如 "2026-03-24 14:30:00",用
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")解析 - 获取当前时刻:
LocalDateTime.now() - 判断是否在区间内:
now.isAfter(start) && now.isBefore(end) - 注意:如果 start 或 end 是 null,先做空值校验,否则会抛异常
数据库里存的是 Date 类型?别硬转,优先升级写法
老项目可能还在用 java.util.Date,它本身不区分日期/时间,容易因时区或毫秒截断出错。建议逐步替换:
- 读库时,用 JDBC 4.2+ 的
ResultSet.getObject("col", LocalDateTime.class)直接取 LocalDateTime - 如果必须用 Date,转 LocalTime 前务必指定时区:
date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime() - 避免用
new Date().before(anotherDate)这类旧方式,可读性和线程安全性都较差
边界情况不能忽略
实际运行中常踩坑的几个点:
- 起始日期大于结束日期 → 先校验
start.isBefore(end),否则结果恒为 false - 想包含当天或当时 → 改用
!now.isBefore(start)代替isAfter(start),前者包含等于 - 跨年比较没问题,LocalDate 和 LocalDateTime 都天然支持;但跨时区需额外处理 ZoneId
- 测试时别只用今天,手动构造 yesterday/tomorrow 的实例验证逻辑分支
不复杂但容易忽略细节。抓住“比什么”(日期 or 时间点)、“怎么取当前值”、“边界怎么算”这三点,基本就能稳住。










