错误示例:

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

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

  1. JAVA把毫秒数转换成日期

    JAVA把毫秒数转换成日期 systemMillonSenconds = System.currentTimeMillis();   2012-08-17 14:42 1456人阅读 评论(1) 收藏 ...

  2. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  3. Calendar计算一个月前的日期,踩坑记录

    错误示范:calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);//获取一个月前的今天这种写法假设传入的日期为2019-03-3 ...

  4. java ArrayList 踩坑记录

    做编程的一个常识:不要在循环过程中删除元素本身(至少是我个人的原则).否则将发生不可预料的问题. 而最近,看到一个以前的同学写的一段代码就是在循环过程中删除元素,我很是纳闷啊.然后后来决定给他改掉.然 ...

  5. Java int和integer有什么区别 (mybatis踩坑)

    不要在实体类中使用int 我们都知道Integer是int的包装类,而int是基本数据类型.所以Integer类型的变量会初始化为null,int类型则会被初始化为0 . 所以在下面的动态拼接例子中: ...

  6. Java实现 蓝桥杯 算法提高 日期计算

    算法提高 日期计算 时间限制:1.0s 内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情 ...

  7. lua时间戳和日期转换及踩坑

    介绍lua的日期函数常用方法及我的一个踩坑. 时间戳转日期 os.date("%Y%m%d%H",unixtime) --os.date("%Y%m%d%H", ...

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

    方法一可以使用date的getTime()方法来将当前日期格式的时间转换为毫秒数,进而相减. long systime = new Date().getTime();//当前系统时间        l ...

  9. 【转】Java日期计算之Joda-Time

    Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time.可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成. http:// ...

随机推荐

  1. jquery遍历获取每一行数据进行对比

    $("#dtlTable tr:gt(0)").each(function(i){ var orderQtyBy = $("input[name='orderQtyBys ...

  2. java之分隔符问题

    java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^ 报这个错的原因是因为在java中“ ...

  3. pycharm快捷键及常用设置

    Alt+Enter 自动添加包 shift+O 自动建议代码补全 Ctrl+t SVN更新 Ctrl+k SVN提交 Ctrl + / 注释(取消注释)选择的行 Ctrl+Shift+F 高级查找 C ...

  4. 计算概论(A)/基础编程练习2(8题)/6:数组逆序重放

    #include<stdio.h> int main() { // 输入n个整数 ; scanf("%d", &n); // 循环读入元素 while(scan ...

  5. Zookeeper本地模式安装

    本地模式安装部署 1.安装前准备 (1)安装Jdk (2)拷贝Zookeeper安装包到Linux系统下 (3)解压到指定目录 tar -zxvf zookeeper-3.4.10.tar.gz -C ...

  6. Storm学习笔记1:Storm基本组件

    Storm概念及组件 Nimbus:负责资源分配和任务调度. Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程. Worker:运行具体处理组件逻辑的进程 ...

  7. Huffman Implementation with Python

    Huffman Implementation with Python 码表 Token Frequency a 10 e 15 i 12 s 3 t 4 space 13 n 1 生成 Huffman ...

  8. Android之数据存储之SharedPreferences

    SharedPreferences是以键值对形式存储数据,主要用于记录系统的设置,如飞行模式是否开启,声音大小的值等.//SharedPreferences方式保存到xml文件SharedPrefer ...

  9. python简说(十二)time模块

    1.时间戳 print(int(time.time())) 2.取当前格式化好的时间 time.strftime('%Y-%m-%d %H:%M:%S') 3.时间戳转为格式化好的时间 time1 = ...

  10. LOIC

    Pre: http://sourceforge.net/projects/loic Getting the Software To DDos, first your going to have to ...