Java日期比较的坑

说这个Java日期比较,无非就是date.before(date1)或者是date.after(date2)来进行判断哪个日期在前,哪个日期在后,一般而言,对于同一天的日期比较也没什么问题,这两个方法也能返回正常值,但对于如下的两个日期比较,却成功的“骗”过了before和after

public static void compareDate() throws ParseException {
        
        //当前月份为2020年11月
        Date date = new Date();
        date.setDate(1);
        date.setHours(0);
        date.setMinutes(0);
        date.setSeconds(0);
        
        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); 
        String mpdateStr = "2020-11-01";
        Date mpDate = format1.parse(mpdateStr);
        
        if(mpDate.before(date) ) {
            System.out.println("mpdate is before");
        } else {
            System.out.println("mpdate is after");
        }
        
    }

按照代码逻辑来看,进行比较的两个日期都是2020-11-01,使用before应该是会返回false的,故应该打印 mpdate is after

但结果如下:

输出的 mpdate is before,为啥呢?首先我们先看下before的实现原理

并没有类似<=的操作,所以比较两个相等的值肯定不会返回true

然后我们通过源码可以看到before对比的就是两个日期的时间戳,现在我们把两个日期的时间戳来打印出来看下

这里我们可以明现看到date是要比mpdate多了751毫秒,所以此时的before和after是能够比较出两个值谁打谁小,那么针对这个问题我们怎么解决呢?

上代码!

    public static void compareDate2() throws ParseException {
        
        //当前月份为2020年11月
        Date time = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(time);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0); //时
        cal.set(Calendar.MINUTE, 0); //分
        cal.set(Calendar.SECOND, 0); //秒
        cal.set(Calendar.MILLISECOND, 0); //毫秒
        Date date = cal.getTime();
        
        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); 
        String mpdateStr = "2020-11-01";
        Date mpDate = format1.parse(mpdateStr);
        
        if(mpDate.before(date) ) {
            System.out.println("mpdate is before");
        } else {
            System.out.println("mpdate is after");
        }
        
        System.out.println("mpDate:" + mpDate.getTime());
        System.out.println("date:" + date.getTime());
        
    }

此时我们通过Calendar来强制设置时间的毫秒数为0,那么我们再看下控制台的输出:


我们可以看到,这个时间戳就是我们原本想要的数据,最终打印的结果也是我们的预期结果了

兄弟们,共勉!!!!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容