【小家java】Java中对时间戳相加减的问题(向前推100天,答案却让我匪夷所思)

相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃
【小家java】java6新特性(简述十大新特性) 鸡肋升级
【小家java】java7新特性(简述八大新特性) 不温不火
【小家java】java8新特性(简述十大新特性) 饱受赞誉
【小家java】java9新特性(简述十大新特性) 褒贬不一
【小家java】java10新特性(简述十大新特性) 小步迭代
【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


每篇一句

自从开了自动挡的车,人生就只有悲欢没有离合。只有加油,没有档次

序言

关于时间的计算,会体现在我们程序的方方面面。然后我最近在写一个需求的时候,躺了一个大坑

需求概要

我的需求大概是这样的:我写了一个任务,每天晚上去执行。会把当前时间三天以前的数据都拿出来处理,然后这个x天的变量是我随意可变可传的。开始默认的值是3,后来改成5都相安无事,数据处理正确。

但是某一天我手动触发任务的时候,传值100的时候,问题出现了
贴出我的时间计算代码:

 //往前推算x天
        int dayCount = 10;
        
        Long endTime = System.currentTimeMillis();
        Long startTime = endTime - (dayCount * 24 * 60 * 60 * 1000);
        System.out.println(new Date(endTime)); //Mon Oct 29
        System.out.println(new Date(startTime)); //Fri Oct 19

当这个dayCount值还是10 的时候,显然是没有问题的。现在我们调高到100,看看输出:

 //往前推算x天
        int dayCount = 100;

        Long endTime = System.currentTimeMillis();
        Long startTime = endTime - (dayCount * 24 * 60 * 60 * 1000);
        System.out.println(new Date(endTime)); //Mon Oct 29
        System.out.println(new Date(startTime)); //Sun Oct 28

竟然,竟然只往前前进了一天。
如果我们往前推200天呢?

 //往前推算x天
        int dayCount = 100;

        Long endTime = System.currentTimeMillis();
        Long startTime = endTime - (dayCount * 24 * 60 * 60 * 1000);
        System.out.println(new Date(endTime)); //Mon Oct 29
        System.out.println(new Date(startTime)); //Sun Oct 28

更加大跌眼镜
偶买噶,直接导致我的任务计算错误了,损失不小啊,抹泪。。。

分析原因

表面上看上去,完全没有问题,为毛出问题了呢?
其实,这个就是考验一个程序员的JDK基本功了,然后我就猜测,有没有可能是后面的计算值是int值,然后计算出来的结果超过了int的最大值,产生了溢出呢?

为了证明我的猜想,做如下简单试验:

System.out.println(100 * 24 * 60 * 60 * 1000);  //50065408
System.out.println(Integer.MAX_VALUE);  //2147483647

奇怪把,100天的时间戳,超出了Integer的最大值,所以产生了溢出。

基础知识:java的默认类型为int、double等,使用的时候一定需要引起注意

如何解决?

解决办法其实很简单,重点在于分析找原因的过程。需要基础知识的储备,和一步步的探索
解决办法:使用long装载

Long startTime = endTime - (dayCount * 24 * 60 * 60 * 1000L);

只需要尾部加个L轻松解决。

像这种影式的的类型问题,非常的隐蔽。可能数值小的时候很和谐不会出问题,但数字大了,就出现问题了,而且非常不好定位问题的根源,因此编码的时候一定要规范,能显示写出来的东西,不用影式的处理


关注A哥

AuthorA哥(YourBatman)
个人站点www.yourbatman.cn
E-mailyourbatman@qq.com
微 信fsx641385712
活跃平台
公众号BAT的乌托邦(ID:BAT-utopia)
知识星球BAT的乌托邦
每日文章推荐每日文章推荐

BAT的乌托邦

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值