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

错误示例:

Date today = new Date();
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),不然就会计算出错。如果这个计算的参数由用户自己输入的话,更要注意这个问题(最好转成字符串,再用比较大的数据类型去解析)

时间: 2024-08-07 20:24:18

java用毫秒数做日期计算的一个踩坑记录的相关文章

JAVA把毫秒数转换成日期

long sd=1345185923140L; Date dat=new Date(sd); GregorianCalendar gc = new GregorianCalendar(); gc.setTime(dat); java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String sb=format.format(gc.getTime()); Sys

Java ArrayList 踩坑记录

做编程的一个常识:不要在循环过程中删除元素本身(至少是我个人的原则).否则将发生不可预料的问题. 而最近,看到一个以前的同学写的一段代码就是在循环过程中删除元素,我很是纳闷啊.然后后来决定给他改掉.然后引发了另外的惨案. 原来的代码是这样的: public List<A> getUserDebitCard(A cond) { List<A> list=userService.getCard(cond); List<A> result=null; if(list!=nul

Java语言学习(5)-Java中基础封装类(日期、时间类)

日期和时间封装类 1. Data类 Java日期和时间采用Data类.Data类在java.util包中. Data类构造函数: 1)       Data()   采用当前时间初始化对象: 2)       Data(long millisec)   采用1970年1月1日起时间毫秒数来初始化对象. Data类的方法: 1)       boolean after(Data d).boolean before(Data d) Data对象和参数指定日期较早晚,返回boolean值. 2)   

常用日期计算

# 获取最小的日期(通常用于做日期计算) Get-Date 0 # 获取当前日期 Get-Date # 获取当前日期的年 (Get-Date).Year # 获取当前日期的月 (Get-Date).Month # 获取当前日期的日 (Get-Date).Day # 获取从今年起的天数 (Get-Date).DayOfYear # 获取星期 (Get-Date).DayOfWeek # 今年的第一天 (Get-Date 0).AddYears((Get-Date).Year - 1) # 今年的最

Java日期时间API系列17-----Jdk8中java.time包中的新的日期时间API类,java日期计算4,2个日期对比,获取相差年月日部分属性和相差总的天时分秒毫秒纳秒等

通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别 ,可以看出java8设计非常好,新增了Period和Duration类,专用于对比2个时间场景: Period,可以获取2个时间相差的年月日的属性. Duration,可以获取2个时间相差总的天时分秒毫秒纳秒. 下面应用: /** * 获取2个日期的相差年月天的年数部分 * @param startInclusive * @param endExclusive

java 获取两个日期相差的毫秒数

方法一可以使用date的getTime()方法来将当前日期格式的时间转换为毫秒数,进而相减. long systime = new Date().getTime();//当前系统时间        long oldtime = old.getTime();//相比较的时间        Long time = (systime - oldtime);//相差毫秒数 方法二则使用calendar 的getTimeInMillis() 方法来将当前日期格式的时间转换为毫秒数. Calendar no

Java日期计算之Joda-Time

http://rensanning.iteye.com/blog/1546652 Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time.可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成. http://joda-time.sourceforge.net/ 版本:joda-time-2.1.jar 1.时间类得作成 Java代码   //方法一:取系统点间 DateTime dt1 = new DateTime();

JAVA中日期转换和日期计算的方法

日期的格式有很多形式,在使用过程中经常需要转换,下面是各种类型转换的使用例子以及日期计算方法的例子. 一.不同格式日期相互转换方法 1 public class TestDateConvertUtil { 2 3 public static void main(String[] args) throws ParseException { 4 // 获取当前时间 5 Date date = new Date(); // 获取当前时间 6 long timestamp = System.curren

毫秒数转成日期 得到天数

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); long now = System.currentTimeMillis(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(now); System.out.println(now + " = " + formatter.format(cal