首页 > 技术文章 > Calendar日期相同CompareTo返回不为0的问题

ciweiyu 2020-11-24 11:17 原文

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

推荐阅读