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

  • 相关阅读:
    线性表的顺序存储结构详解
    Java就业急训营-感悟与分享
    在Ubuntu系统下用C语言编写程序
    NTIRE介绍和近年来超分SR结果展示
    《王道操作系统》学习笔记:计算机系统概述
    JavaScript 语言通识 — 重学 JavaScript
    python利用numpy存取文件
    Batch Normalization(批标准化,BN)
    全零填充(padding)
    感受野(Receptive Field)理解为什么采用多层小卷积核来替换一层大卷积核
  • 原文地址:https://www.cnblogs.com/xujanus/p/7614346.html
Copyright © 2011-2022 走看看