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

  • 相关阅读:
    联想yoga pro 13 使用Hyper-v蓝屏错误PAGE_FAULT_IN_NONPAGED-AREA的解决办法
    部署 Halo 博客系统
    GiuHub高级搜索关键字
    layer提示框弹出异常抖动,而且不显示
    bootstrap同一页面上多个模态框
    border-radius
    git查看本机ssh公钥
    简单的git连接远程仓库小记
    hexo搭建完成后输入hexo s 没有生成Html静态文件
    application/xml and text/xml的区别
  • 原文地址:https://www.cnblogs.com/xujanus/p/7614346.html
Copyright © 2020-2023  润新知