实习踩坑之路:LocalDateTime计算间隔天数,compareTo/Period的beetween方法导致的bug

本文讲述了在后端开发中遇到的一个问题,即使用LocalDateTime的compareTo方法和Period.between方法计算两个日期间隔天数时出现的错误。当日期间隔超过一个月时,这些方法返回的并不是准确的天数差。作者通过分析源码,揭示了问题的原因,并提出了使用LocalDateTime的until方法作为解决方案,确保正确计算日期间隔。
摘要由CSDN通过智能技术生成

业务场景

我这个地方是要做一个批处理操作,拿到一个List对象列表,判断对象列表的会员服务到期时间是什么时候,如果到期时间和现在当前时间相隔1天,也就是小于两天,我就要对此次操作失败,把以前的状态更改回来,所以加了一个

    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)

注解
问题是,我刚开始用LocalDateTime的compareTo方法比较时间是对的,但是后来发现如果这个想差间隔大于了一个月的到的间隔天数就不对了,具体如下

问题复现

    public static void main(String[] args) {
   
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime expireTime = now.plusDays(3);
        System.out.println("间隔天数:" + expireTime.compareTo(now));
    }
运行结果:间隔天数:3
    public static void main(String[] args) {
   
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime expireTime = now.plusDays(30);
        System.out.println("间隔天数:" + expireTime.compareTo(now));
    }
运行结果:间隔天数:1

为什么会出现这个状况呢?

compareTo方法

    public int compareTo(ChronoLocalDateTime<?> other) {
   
        if (other instanceof LocalDateTime) {
   
            return compareTo0((LocalDateTime) other);
        }
        return ChronoLocalDateTime.super.compareTo(other);
    }

    private int compareTo0(LocalDateTime other) {
   
        int cmp = date.compareTo0(other.toLocalDate());
        if (cmp == 0) {
   
            cmp = time.compareTo(other.toLocalTime());
        }
        return cmp;
    }

我们的参数传进来后会首先进行一个compareTo0的方法,这个方法就有猫腻了

    int compareTo0(LocalDate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会写代码的花城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值