说这个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,那么我们再看下控制台的输出:

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