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
相关产品推荐
相关产品推荐

