被自己坑之LocalDate

这是一个真实的故事,故事的主人公就是“村长”本人,危险动作,请勿模仿!

一个寒冷的下午,屋里开着空调,测试人员说***这个订单状态不对,你看下。此时内心毫无波澜,气定神闲,用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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值