当前日期减去指定天数后 ,日期没有减少反而增加了

本文记录了一个关于日期计算的小陷阱,即当使用Java进行日期减法运算时,由于整数溢出导致预期减去30天反而增加了时间的问题。通过分析代码发现,原因是常量乘积超出了int类型的取值范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当前日期减去指定天数后 ,日期没有减少反而增加了

这也许是一个很蠢的事情,之所以写下来是为了 铭记 这次蠢事 , 告诫自己以后细心一些 , 另一反面也抱着侥幸心理 , 觉得自己不是第一个干这种事情人 , 伟大点说是帮助后者解惑 , 自私些就是当你看到这篇博文是我也在”嘲笑”你和我一样 , 希望你也长点心.

事情的经过是这样的

需求是提供一个API接口供合作方查询指定日期的订单情况 , 有一个起始日期和结束日期 .如果两个日期有一个不传就默认查询从昨天开始30天的订单 . 请注意 , 是30天.

代码如下:

 Calendar currentCalendar = Calendar.getInstance();
 currentCalendar.set(currentCalendar.get(Calendar.YEAR),    
 currentCalendar.get(currentCalendar.DATE), 0, 0, 0);           
 Date dateEnd = currentCalendar.getTime();              
 Date dateStart = new Date(dateEnd.getTime() - (1000 * 60 * 60 * 24 * 30)); 

各位可以运行一下,结果却是出乎意料
我当前的时间是: Wed Feb 15 00:00:00 CST 2017
减去30天的时间是: Mon Mar 06 17:02:47 CST 2017

要不是亲眼所见,我就信了……………


问题原因

(1000 * 60 * 60 * 24 * 30)超出了int的数值范围 , 此时为负数

解决办法

(1000 * 60 * 60 * 24 * 30l) 加个l转为long型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值