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),不然就会计算出错。如果这个计算的参数由用户自己输入的话,更要注意这个问题(最好转成字符串,再用比较大的数据类型去解析)
java用毫秒数做日期计算的一个踩坑记录的更多相关文章
- JAVA把毫秒数转换成日期
JAVA把毫秒数转换成日期 systemMillonSenconds = System.currentTimeMillis(); 2012-08-17 14:42 1456人阅读 评论(1) 收藏 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- Calendar计算一个月前的日期,踩坑记录
错误示范:calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);//获取一个月前的今天这种写法假设传入的日期为2019-03-3 ...
- java ArrayList 踩坑记录
做编程的一个常识:不要在循环过程中删除元素本身(至少是我个人的原则).否则将发生不可预料的问题. 而最近,看到一个以前的同学写的一段代码就是在循环过程中删除元素,我很是纳闷啊.然后后来决定给他改掉.然 ...
- Java int和integer有什么区别 (mybatis踩坑)
不要在实体类中使用int 我们都知道Integer是int的包装类,而int是基本数据类型.所以Integer类型的变量会初始化为null,int类型则会被初始化为0 . 所以在下面的动态拼接例子中: ...
- Java实现 蓝桥杯 算法提高 日期计算
算法提高 日期计算 时间限制:1.0s 内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情 ...
- lua时间戳和日期转换及踩坑
介绍lua的日期函数常用方法及我的一个踩坑. 时间戳转日期 os.date("%Y%m%d%H",unixtime) --os.date("%Y%m%d%H", ...
- java 获取两个日期相差的毫秒数
方法一可以使用date的getTime()方法来将当前日期格式的时间转换为毫秒数,进而相减. long systime = new Date().getTime();//当前系统时间 l ...
- 【转】Java日期计算之Joda-Time
Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time.可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成. http:// ...
随机推荐
- Com类型
/* VARIANT STRUCTURE * * VARTYPE vt; * WORD wReserved1; * WORD wReserved2; * WORD wReserved3; * unio ...
- dubbo原理
1,观察DubboBeanDefinitionParser 的构造方法,给它打一个断点,发现其前一步在DubboNamespaceHandler 应用启动会连续调此方法 DubboBeanDefini ...
- manytomany django 正查, 反查
models from django.db import models from django.contrib.auth.models import User class GroupSheet(mod ...
- Linux查看机器和硬盘的SN
查看硬件RAID中某块硬盘SN # sas 口: [root@ ~]$ smartctl -a /dev/sda -d megaraid,n *** Serial number: 6RJ974SR * ...
- rabbitmq集群安装与配置(故障恢复)
0.首先按照http://www.cnblogs.com/zhjh256/p/5922562.html在至少两个节点安装好(不建议单机,没什么意义) 1.先了解rabbitmq集群架构,http:// ...
- Android - Resource 之 String 小结
简单的string: <?xml version="1.0" encoding="utf-8"?> <resources> <st ...
- 2018-2019-1 20189206 vim.c插件安装
vim插件安装 vim插件安装 由于今天在安装vim.c插件耗费了很多时间,配置文件一直不生效,特此记录以下安装插件的方法. 安装vim.c按照博客的方法 第一步:创建目录~/.vim 这个目录是用来 ...
- Codeforces 827E Rusty String - 快速傅里叶变换 - 暴力
Grigory loves strings. Recently he found a metal strip on a loft. The strip had length n and consist ...
- Bootstrap3基础 navbar 导航条 简单示例
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- C# 字典常用方法
/* ######### ############ ############# ## ########### ### ###### ##### ### ####### #### ### ####### ...