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

业务场景

我这个地方是要做一个批处理操作,拿到一个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 otherDate
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
计算两个 LocalDateTime 之间相隔的天数,可以使用`ChronoUnit`类的`between`方法。具体步骤如下: 1. 首先,确定你需要比较两个 LocalDateTime 对象,假设为 `now` 和 `expireTime`。 2. 使用 `ChronoUnit.DAYS.between(now, expireTime)`,该方法会返回两个日期之间的天数差。 下面是一个示例代码: ```java LocalDateTime now = LocalDateTime.now(); LocalDateTime expireTime = now.plusDays(3); long daysBetween = ChronoUnit.DAYS.between(now, expireTime); System.out.println("间隔天数:" + daysBetween); ``` 运行结果为:间隔天数:3 对于你提到的比较相隔一个月的情况,`compareTo` 方法无法直接计算两个 LocalDateTime 之间的天数差。因为 `compareTo` 方法比较两个 LocalDateTime 对象的顺序,而不考虑具体的时间间隔。如果你想要计算相隔一个月的天数差,请使用上述的 `ChronoUnit.DAYS.between` 方法,并将 `plusDays(30)` 更换为 `plusMonths(1)`。 希望这可以解决你的问题。如果还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [实习之路LocalDateTime计算间隔天数compareTo/Periodbeetween方法导致bug](https://blog.csdn.net/qq_22155255/article/details/122105708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [LocalDateTime转换Date 日期比较 日期相差天数](https://blog.csdn.net/muranchenhui/article/details/125927181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会写代码的花城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值