Java踩坑日记之long值计算:获取60天的毫秒数

11 篇文章 0 订阅

场景:返回每个用户近60天内的信息!

由于数据库每条信息存储的时间是毫秒时间戳,因此肯定有一步必不可少的环节,是计算60天内的毫秒时间戳。

具体实现

    public static void main(String[] args)
    {
        long msIn60Days = 24 * 60 * 3600 * 1000;
        System.out.println("60天内的毫秒数:" + msIn60Days);
    }

结果验证

你会不会认为这样就真的正确了?
我们来看看输出的真实结果是什么:

60天内的毫秒数:889032704

这个值真的对么?如果对,为什么最终返回的数据记录只有“10天左右”的呢?
我们先来验证下这个值到底是多少天的毫秒时间戳:

    public static void main(String[] args)
    {
        long msIn60Days = 24 * 60 * 3600 * 1000;
        System.out.println("60天内的毫秒数:" + msIn60Days);
        System.out.println(msIn60Days / (24L * 3600 * 1000));
    }

执行后,最终输出:

60天内的毫秒数:889032704
10

输出的结果是10天左右的毫秒,是的,你终于看到了,你不得不承认,这就是真实的结果!

根因分析

定义的类型明明是long类型,为什么最终会变成一个int值呢?那是因为在计算“24 * 60 * 3600 * 1000”的时候,这四个值相乘,四个值没有一个是long类型的,因此计算出来最终结果就是int类型,由于本身60天内的毫秒数大概是51亿左右,已经远远超过java int的最大值21亿,因此最终问题定位为:java int类型值溢出导致

解决方法

1. 给其中一个值转换成long类型即可
    public static void main(String[] args)
    {
        long msIn60Days = 24 * 60 * 3600L * 1000;
        System.out.println("60天内的毫秒数:" + msIn60Days);
        System.out.println(msIn60Days / (60L * 3600 * 1000));
    }

执行最终输出:

60天内的毫秒数:5184000000
60
2. 建议使用TimeUnit.DAYS.toMillis,不会让你忘记做类型转换
    public static void main(String[] args)
    {
        long msIn60Days = TimeUnit.DAYS.toMillis(60);
        System.out.println("60天内的毫秒数:" + msIn60Days);
        System.out.println(msIn60Days / (24L * 3600 * 1000));
    }

执行后最终输出是一致!

总结

在计算long类型的时候,千万不要以为变量类型定义为long,最终就一定返回为long,要知道java数字默认是int类型参与计算,因此如果若干个数字相加或者相乘,即便变量定义为long,最终也只会输出int类型值!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

龙殿殿主

你的打赏是我精心创作的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值