`
nuistcc
  • 浏览: 84026 次
社区版块
存档分类
最新评论

java Date.setTime时间设置逆流

阅读更多

       业务开发过程中需要对java.util.Date的时间进行设置,使用了void java.util.Date.setTime(long time)方法,但在测试过程中却发现millisecond超过某一定长度后出现了“逆流”,时间出现了回退现象。

 

现象描述

       (1)我们先看一下正常情况下的例子,将当天时间增加10天

 

public static void main(String[] args) {
        Date now = new Date();
        System.out.println("now time  : " + now);
        now.setTime(now.getTime() + 60 * 60 * 24 * 1000 * 10);
        System.out.println("next1 time : " + now);
    }

 

返回结果如下:

 

now time  : Thu Feb 09 11:26:28 CST 2017
next time : Sun Feb 19 11:26:28 CST 2017

 

从返回值可以看出时间设置成功,当前时间被往后推了10天。

 

(2)我们再看一下异常情况的例子,将当前时间增加365天

 

public static void main(String[] args) {
        Date now = new Date();
        System.out.println("now time   : " + now);
        now.setTime(now.getTime() + 60 * 60 * 24 * 1000 * 365);
        System.out.println("next2 time : " + now);
    }

 

返回结果如下:

 

now time   : Thu Feb 09 11:39:16 CST 2017
next2 time : Sun Feb 26 12:19:45 CST 2017

 

从结果中可以看出被设置后的时间没有往后累加365天,反而只是加了十几天,时间还是停留在2017年,出现的结果和期望值不一样!

 

原因分析

       仔细对比了两个例子的代码,唯一不一样的地方就是一个时间乘以了10,另一个时间乘以了365,其他代码都是一样的,百思不得其解。

       多试了几种异常情况后,发现乘以的天数达到某一阈值后会出现时间回退现象,而在这个阈值之前的设置都是正常的,并且回退出现循环情况。

       发现这个规律后,第一想到的就是数据值长度超出某数据类型的最大值后被循环截断了。这时再分析下数据表达式,发现“60 * 60 * 24 * 1000 * 365”这个地方可能存在问题,换一种方式处理后果然验证了猜想!

 

public static void main(String[] args) {
        Date now = new Date();
        System.out.println("now time   : " + now);
        long addTime = 60 * 60 * 24 * 1000 * 365L;
        now.setTime(now.getTime() + addTime);
        System.out.println("next3 time : " + now);
    }

 

返回结果正常:

 

now time   : Thu Feb 09 11:51:37 CST 2017
next3 time : Fri Feb 09 11:51:37 CST 2018

 

     现在可以看出,是“60 * 60 * 24 * 1000 * 365”的计算结果被当成int型数据截断了!如果显示的将其标识为long型数据就没有问题了。

     这个也提醒我们在处理时间毫秒等长数据类型时一定要显示的使用long型,即使下面这种前置声明方式也会有问题:

 

public static void main(String[] args) {
        Date now = new Date();
        System.out.println("now time   : " + now);
        long addTime = 60 * 60 * 24 * 1000 * 365;
        now.setTime(now.getTime() + addTime);
        System.out.println("next4 time : " + now);
    }

 

异常结果:

 

now time   : Thu Feb 09 11:55:45 CST 2017
next4 time : Sun Feb 26 12:36:14 CST 2017

 

这段测试代码和上一段唯一不一样的地方在于:

 

long addTime = 60 * 60 * 24 * 1000 * 365L

long addTime = 60 * 60 * 24 * 1000 * 365;

 

 通过最后这个例子相信大家已经知道这个时间设置问题的本质原因了!

分享到:
评论

相关推荐

    java.util.Date与java.sql.Date互转及字符串转换为日期时间格式.docx

    java.util.Date utilDate = new java.util.Date(sqlDate.getTime()); ``` #### 三、字符串转换为日期时间格式 将字符串转换为日期时间格式通常需要用到`SimpleDateFormat`类。下面分别介绍两种常见的字符串到日期...

    java.util.Date与java.sql.Date相互转换

    java.util.Date utilDate = new java.util.Date(sqlDate.getTime()); // java.util.Date 转换为 java.sql.Date java.util.Date utilDate = new java.util.Date(); java.sql.Date sqlDate = new java.sql.Date...

    10.javaDate类.zip

    10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类.zip10.javaDate类...

    java.sql.date与java.util.date.pdf

    java.util.Date utilDate = new java.util.Date(sqlDate.getTime()); ``` 在向数据库插入日期时,可以使用 `PreparedStatement` 的 `setDate()` 方法,传入对应的 `java.sql.Date` 对象。如果数据库字段是日期类型...

    java.util.Date与java.sql.Date互转及字符串转换为日期时间格式[文].pdf

    java.util.Date utilDate = new java.util.Date(sqlDate.getTime()); 二、字符串转换为日期时间格式 可以使用SimpleDateFormat将字符串转换为日期时间格式: String dateStringToParse = "2007-7-12"; ...

    javadate.rar_java 控制台 日历

    在这个名为“javadate.rar”的压缩包中,我们可能找到了一个简单的Java应用程序,它能够在命令行界面(控制台)上显示日历。这个程序可能是基于`java.util.Calendar`或`java.time.LocalDate`类来设计的。 `java....

    JAVA String转化成java.sql.date和java.sql.time方法示例

    "JAVA String转化成java.sql.date和java.sql.time方法示例" JAVA String转化成java.sql.date和java.sql.time方法示例是Java开发中常见的操作,下面我们将详细介绍这两个方法的实现过程。 java.sql.Date和java.util...

    php报时区错误,按照网上说的改时间date.timezone根本不管用!怎么解决,看我的.zip

    php报时区错误,按照网上说的改时间date.timezone... You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still

    java-date.zip_java

    总结来说,"java-date.zip_java"这个压缩包文件很可能包含了如何在Java中判断两个时间段是否有交叉的教程或代码示例,涉及到了`java.util.Date`、`java.util.Calendar`以及`java.time`包中的相关类。在实际应用中,...

    Java 之 Date 和 Calendar 实例

    4. `setTime(long time)`:设置日期为指定的毫秒值。 然而,`Date`类没有提供修改日期和时间的方法,这导致了`Calendar`类的诞生。`Calendar`是一个抽象类,提供了更为灵活的日期和时间操作。它是线程安全的,可以...

    mysql时间类型对应的java类型1

    - `java.time.*`(Java 8引入的新日期时间API)的类如`LocalDate`、`LocalTime`和`LocalDateTime`也可以转换为SQL类型,通过`PreparedStatement.setObject()`方法。 - **从MySQL到Java**: - 当从数据库查询结果...

    java.lang.IllegalArgumentException Cannot format given Object as a Date

    1. **传入的参数不是日期对象**:如果你尝试用`SimpleDateFormat`的`format()`方法处理非`java.util.Date`、`java.sql.Date`、`java.time.LocalDate`等日期类型的对象,Java会抛出此异常。确保你传递的是正确的日期...

    Java Date Time教程-java.util.Date

    Java的java.util.Date类是Java初的时间类之一。该类的大部分方法已不推荐使用,取而代之的是java.util.Calendar类。不过你仍然可以使用java.util.Date类去表示某个时间。下面是一个如何实例化java.util.Date的例子:...

    java中NextDate类

    currentDate.setTime(currentDate.getTime() + (24 * 60 * 60 * 1000)); // 每天的毫秒数 return currentDate; } } ``` 为了打印出日期,我们需要一个`main`方法来测试我们的`NextDate`类: ```java public ...

    Java_Date_日期时间整理

    Java_Date_日期时间整理 Java 中的日期时间处理是非常重要的,以下是 Java 中日期时间整理的知识点总结: 一、获取服务器端当前日期 在 Java 中,可以使用 `java.util.Date` 类来获取服务器端当前日期。可以使用...

    java_sql_Date与java_util_Date转换

    java_sql_Date与java_util_Date转换

Global site tag (gtag.js) - Google Analytics