这是一个真实的故事,故事的主人公就是“村长”本人,危险动作,请勿模仿!
一个寒冷的下午,屋里开着空调,测试人员说***这个订单状态不对,你看下。此时内心毫无波澜,气定神闲,用xshell连上服务器,敲下熟悉的tail -200f xxxxx.log。
“那个谁,你说啥来着?再走一笔,我看下日志!”,依旧非常自信,估计是前端显示的事,之前那几个bug都是前端的,我亲手写的代码,肯定没问题。
看着看着…不对劲啊,过了一会,定位到问题在哪了,是我的自动任务,有一个时间判断没有走进去,带着疑问开始了以下的探险之旅。
if的判断条件是用自己写的DateUtils类的isDateBefore(),比较两个Date变量的大小,这个方法都用了一年了,应该没有问题才对。以下是方法的代码:
public static boolean isDateBefore(Date date1, Date date2) {
if (date1 != null && date2 != null) {
return getLocalDateTime(date1).toLocalDate().isBefore(getLocalDateTime(date2).toLocalDate());
}
return false;
}
继续debug发现方法永远返回false,以为是方法参数写反了,调换之后还是false,这就闹鬼了!!!开始心虚,以为是眼花了,气定神闲之后还是不对。
我是想比较时间距离A是否已经超过了一小时,用自动任务来写的:
//要比较的时间Date needCheck
//获取当前时间
Date now = DateUtils.getDate();
//获取当前时间的前一小时
Date limitDate = DateUtils.minusHours(now, 1);
//比较needCheck是否已经过了一小时了
if (DateUtils.isDateBefore(needCheck, limitDate)) {
//业务代码
}
一步一步跟进去之后终于发现是什么原因了,当时真想呼自己一嘴巴,太傻了。
还是看上面isDateBefore方法,getLocalDateTime(date1).toLocalDate()将时间转换成java.time包下的LocalDate,在利用他自己的isBefore方法比较,源码如下:
public boolean isBefore(ChronoLocalDate other) {
if (other instanceof LocalDate) {
//走到这一步,自己看
return compareTo0((LocalDate) other) < 0;
}
return ChronoLocalDate.super.isBefore(other);
}
int compareTo0(LocalDate otherDate) {
//比较年
int cmp = (year - otherDate.year);
if (cmp == 0) {
//比较月
cmp = (month - otherDate.month);
if (cmp == 0) {
//比较日
cmp = (day - otherDate.day);
}
//???时分秒呢???
}
return cmp;
}
Java8中引入了Instant、LocalDate、LocalTime、LocalDateTime、ZonedDateTime、ZoneId/ZoneOffset等。
Instant:表示时间戳;
LocalDate:与时区无关,表示日期年月日;
LocalTime:与时区无关,表示时间,时分秒等;
LocalDateTime:上面两个的结合,表示日期和时间;
ZonedDateTime:表示特定时区的日期和时间;
ZoneId/ZoneOffset:表示时区。
还有很多:
我的需求是比较时间是否过了一小时,所以需要用LocalDateTime比较合适,方法改为:
public static boolean isDateBefore(Date date1, Date date2) {
if (date1 != null && date2 != null) {
return getLocalDateTime(date1).isBefore(getLocalDateTime(date2));
}
return false;
}
如果比较日期则用LocalDate。
).isBefore(getLocalDateTime(date2));
}
return false;
}
如果比较日期则用LocalDate。
这样问题就解决好了。
下面是“村长”个人的公众号,欢迎一起学习讨论,唠叨村长:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201228225217718.jpg#pic_center)