You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用if语句比较日期时条件分支判断异常问题

问题原因

你的第二个判断分支从根上就用错了API:
getDate()是java.util.Date的遗留废弃方法,返回值是日期对象对应月份里的日字段(取值范围1-31),根本不是完整时间的天级时间戳,完全不能用来做跨时间周期的差值比较。
举个最直观的例子:如果预设结束时间a.getFinFecha()是下个月2号,调用getDate()返回值是2,减7之后得到-5。这时候哪怕当前时间是当月10号,调用getDate()返回10,10 >= -5的条件永远成立,再叠加后面当前时间小于等于结束时间的判断,只要当前时间没超过结束时间,这个分支就一定会被命中,自然永远走不到返回3的else逻辑。

除此之外你的代码还有两个隐性问题:

  • 多次重复调用LocalDateTime.now()生成当前时间对象,极端场景下多次获取的时间存在毫秒级偏差,可能导致判断前后不一致
  • 用java.sql.Timestamp和java.util.Date直接做compareTo本身就存在类型兼容风险,不推荐这么写
修正方案

直接用JDK8之后提供的java.time时间API做计算,彻底弃用Date、Timestamp里的废弃方法,逻辑清晰还能规避所有低级API坑:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;

// 只获取一次当前时间,避免多次调用产生时间差
LocalDateTime currentTime = LocalDateTime.now();
// 把Date类型的预设结束时间转为LocalDateTime,统一使用java.time API
LocalDateTime finFecha = a.getFinFecha().toInstant()
        .atZone(ZoneId.systemDefault())
        .toLocalDateTime();
// 直接计算结束时间往前推7天的时间点,不用手动做字段加减
LocalDateTime threshold = finFecha.minus(7, ChronoUnit.DAYS);

if (currentTime.isAfter(finFecha)) {
    return 1;
} else if (!currentTime.isBefore(threshold) && !currentTime.isAfter(finFecha)) {
    return 2;
} else {
    return 3;
}
注意事项
  • java.util.Date中所有getDate()、getMonth()、getYear()相关的字段获取方法早在JDK1.1版本就被标记为废弃,没有任何生产使用价值,所有日期计算、比较逻辑都应该优先使用java.time包下的对应类实现
  • 时间范围判断不要手动取单个日期字段做加减比较,跨月、跨年、跨时区场景下这类写法100%会出逻辑错误,直接用时间类自带的isBefore、isAfter、minus、plus方法处理即可

内容的提问来源于stack exchange,提问作者Sergio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:03:21