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

java.util.Calendar类compareTo方法返回结果不一致问题咨询

问题原因
  • Calendar.getInstance() 获取实例时会默认初始化当前系统的全量时间字段,包含时分秒、毫秒值。你调用的 set(int year, int month, int date) 重载方法仅会修改年、月、日三个字段,其余时间字段会保留实例创建时的系统时间值。
  • 你打印的日志仅展示到秒级,两个实例的毫秒差异无法从日志中观测到,但compareTo方法会对比完整的毫秒级时间戳。两个Calendar实例创建的间隔存在毫秒差,就会导致相同日期对比结果不稳定。
修复方案

方案1:保留Calendar实现,清空多余时间字段

在设置年月日之前,先调用clear()方法清空所有字段,或者显式将时分秒毫秒都设为0,保证只有日期字段参与对比:

public boolean checkDates(String oldDate, String newDate){
    java.util.Calendar oldCal = java.util.Calendar.getInstance();
    java.util.Calendar newCal = java.util.Calendar.getInstance();
    String[] oD = oldDate.split("-");
    String[] nD = newDate.split("-");
    // 清空所有字段,避免保留时分秒毫秒
    oldCal.clear();
    oldCal.set(Integer.parseInt(oD[0]), Integer.parseInt(oD[1])-1, Integer.parseInt(oD[2]));
    newCal.clear();
    newCal.set(Integer.parseInt(nD[0]), Integer.parseInt(nD[1])-1, Integer.parseInt(nD[2]));

    return newCal.compareTo(oldCal) > 0;
}

方案2:使用Java 8+的java.time API(更推荐)

java.time包下的LocalDate本身仅存储日期维度信息,没有时分秒属性,从根源避免了该问题,代码更简洁不易出错:

import java.time.LocalDate;

public boolean checkDates(String oldDate, String newDate){
    LocalDate oldLocalDate = LocalDate.parse(oldDate);
    LocalDate newLocalDate = LocalDate.parse(newDate);
    return newLocalDate.isAfter(oldLocalDate);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:06:07