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

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

序言


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

需求概要


我的需求大概是这样的:我写了一个任务,每天晚上去执行。会把当前时间三天以前的数据都拿出来处理,然后这个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轻松解决。

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

相关文章
|
15天前
|
Java API
Java时间戳教程
本文详细介绍Java中时间戳的处理方法,包括获取当前时间戳、使用`java.time`包、时间戳与日期的相互转换及格式化等。示例代码展示了如何利用`System.currentTimeMillis()`和`java.time.Instant`获取时间戳,以及如何通过`Date`和`ZonedDateTime`进行日期转换和时区处理。随着Java 8引入的`java.time`包,日期时间操作变得更加强大和便捷,推荐在新项目中优先采用。
|
3月前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
47 3
|
3月前
|
Java 数据库
使用java.sql.Timestamp处理时间戳
使用java.sql.Timestamp处理时间戳
|
4月前
|
Java 存储 数据库
如何用JAVA基于时间戳回放历史数据?
如何用JAVA基于时间戳回放历史数据?
70 4
|
4月前
|
安全 Java 测试技术
滚雪球学Java(51):掌握Java Date类:用法、弊端与时间戳转换技巧,助你轻松处理日期时间
【6月更文挑战第5天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
63 0
滚雪球学Java(51):掌握Java Date类:用法、弊端与时间戳转换技巧,助你轻松处理日期时间
|
4月前
|
Java API
Java代码如何将时间戳转换为时间
【6月更文挑战第27天】Java代码如何将时间戳转换为时间
46 0
|
5月前
|
关系型数据库 MySQL Java
Java时间转换为MySQL中的INT类型时间戳
Java时间转换为MySQL中的INT类型时间戳
|
5月前
|
Java
Java中时间戳转换为时间
Java中将时间戳转为日期时间字符串示例:
33 0
|
5月前
|
JSON 前端开发 Java
JAVA后端向前端传递Long类型数据,导致数据不一致
JAVA后端向前端传递Long类型数据,导致数据不一致
764 0
下一篇
无影云桌面