关于Date类型转换成毫秒数会出现误差

来源:互联网 发布:淘宝网韩版式斗篷女装 编辑:程序博客网 时间:2024/06/02 06:57
public class DateTest {    public static void main(String[] args) {        //获取本周一开始时间        Calendar cal = Calendar.getInstance();          cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);          cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);        System.out.println(cal.getTime());    }}

控制台会输出本周一的开始时间

Mon Apr 24 00:00:00 CST 2017

这样Date类型的数据是没错的,但是当把这个时间转换成毫秒数时就会出错了。
我写这个代码的时候是2017年4月25日,周一的真正开始时间毫秒数为
1492963200000。

public static void main(String[] args) {        //获取本周一开始时间        Calendar cal = Calendar.getInstance();          cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);          cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);        //获得毫秒数        System.out.println(cal.getTime().getTime());    }

运行代码你会发现,你获得的毫秒数并非1492963200000,而是会出现误差,每次运行的结果都不一样。比如:输出如下数据

1492963200592
1492963200789

我是因为做需求的时候要判断取出来的时间是否小于本周一开始时间,小于的话意味着该数据为本周之前的时间。结果碰到了刚好为本周一开始的时间,判断就出现了问题,这样才发现问题。

不只是这个查询本周一的时间毫秒数会出现偏差,只要你用cal来查询本周本月本年的日期都会出现问题。

你可以选择这么写就不会有问题了,以获取当天24点时间为例

public class DateTest {    public static void main(String[] args) {        //获取今天24点时间        Calendar cal = Calendar.getInstance();          cal.set(Calendar.HOUR_OF_DAY, 24);          cal.set(Calendar.SECOND, 0);          cal.set(Calendar.MINUTE, 0);          cal.set(Calendar.MILLISECOND, 0);         //获得毫秒数        System.out.println(cal.getTime().getTime());    }}

建议:判断日期可以直接用date的before、after来比较就可以。这两个方法其实本质上用的也是毫秒数来比较,只是做了封装了。
date类型不能不能用大小于来比较,要用before、after来比较。
if(date1>date2){};这种写法是错误的。

0 0
原创粉丝点击