Calendar日期相同CompareTo返回不为0的问题
场景
导入Excel后,判断Excel的某一列日期是否符合大于当天日期的后一天。
问题
Excel导入的日期后台debug,显示的是完全一致的日期,但是执行CompareTo方法返回的不为0
原因
因为从Excel中导入的日期是不包含毫秒单位的,而Calendar.getInstance()方法如果没读取到毫秒值,会自动初始化Calendar实体时的毫秒.
于是就导致了毫秒单位的不一致
class demo{
...
Date policyBeginDate = cell.getDateCellValue();//Excel中读取到的日期,是不包含毫秒单位的
Calendar calendar = Calendar.getInstance();
calendar.setTime(policyBeginDate);//此时Calendar会“好心”的给你赋予毫秒值,值为创建时的毫秒
calendar.set(Calendar.HOUR_OF_DAY, 00);
calendar.set(Calendar.MINUTE, 00);
calendar.set(Calendar.SECOND, 00);
Calendar tomorrowCalendar = Calendar.getInstance();
tomorrowCalendar.setTime(new Date());//new Date()这个方法是会有毫秒单位的,所以Calendar看到你既然有毫秒单位了,那我就不帮你赋毫值了
tomorrowCalendar.set(Calendar.HOUR_OF_DAY, 00);
tomorrowCalendar.set(Calendar.MINUTE, 00);
tomorrowCalendar.set(Calendar.SECOND, 00);
tomorrowCalendar.add(Calendar.DAY_OF_MONTH,1);
if(calendar.compareTo(tomorrowCalendar) == 0){
//所以即使calendar和tomorrowCalendar日期完全一致,还是永远不会相等
//因为compareTo底层比较的精确度到了毫秒单位
}
}
解决
知道是毫秒的原因后,这里直接初始化毫秒即可了
Calendar.set(Calendar.MILLISECOND,0); //初始化毫秒为0