java 毫秒数一天_java用毫秒数做日期计算的一个踩坑记录

错误示例:

Date today = newDate();

Date nextMonth= new Date(today.getTime() + 30* 1000*60*60*24);

println(today);

println(nextMonth);

Result:  Sat Sep 30 11:18:24 CST 2017

Sun Sep 10 18:15:37 CST 2017

代码说明:上面代码的目的是计算一个月后的日期,从结果发现明显是错误的(回到上个月去了)

原因分析:30* 1000*60*60*24 ,这个表达式,本意是为了获取一个月的毫秒数,用于计算。但是java默认是用int类型来做表达式的返回结果类型的,而这个表达式已经超过int类型的最大值范围,所以变成负数了。导致了计算结果错误。

正确代码(示例一):在表达中加L标识转成long型计算

Date today = new Date();

Date nextMonth = new Date(today.getTime() + 30L * 1000*60*60*24);

println(today);

println(nextMonth);

Result: Sat Sep 30 11:22:06 CST 2017

Mon Oct 30 11:22:06 CST 2017

正确代码(示例二):把一天的毫秒数作为一个独立的long型常量封装好,以后在计算的时候,自动作为long型处理

Date today = new Date();

long ONE_DAY_MILLISECONDS = 1000*60*60*24;

Date nextMonth = new Date(today.getTime() + 30 * ONE_DAY_MILLISECONDS);

println(today);

println(nextMonth);

Result: Sat Sep 30 11:23:02 CST 2017

Mon Oct 30 11:23:02 CST 2017

踩坑感悟:

JAVA语言在做数字计算的时候,并没有办法像解释型语言(如Python)那样,可以输入很长的表达式直接运算。作为数字的表达式,由于有int类型的限制,所以超过一定范围,一定要显示的转类型(L\D),不然就会计算出错。如果这个计算的参数由用户自己输入的话,更要注意这个问题(最好转成字符串,再用比较大的数据类型去解析)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值