减去毫秒数并不能给出预期的结果

时间:2017-06-29 10:01:09

标签: java date datetime grails groovy

Date day1 = set_datetime(2017, Calendar.JUNE, 28, 8, 00, 0); 

Date day2 = set_datetime(2017, Calendar.JUNE, 28, 10, 00, 0);

def set_datetime(int year, int month, int day, int hour, int minute, int second) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, day, hour, minute, second);
        Date cal_date = cal.getTime();
        return cal_date
    }

println "\t\t (day2.getTime() - day1.getTime()) = " + (day2.getTime() - day1.getTime())
  

(day2.getTime() - day1.getTime()) = 7199996

这里似乎有些不对劲,因为当我将毫秒转换为小时时,7199996并非正好是2小时(7200000)。实际上,它减少了4毫秒。为什么它不是7200000毫秒?

2 个答案:

答案 0 :(得分:6)

您没有清除毫秒字段。

添加

cal.clear();

cal.set(...);行之前,或添加

cal.set(Calendar.MILLISECONDS, 0);

更一般地说,不要使用java.util.Calendarjava.util.Date:它们是旧的,设计不佳的类,充满了众所周知的错误。

使用Java 8中引入的java.time包中的类;或早期版本的Java上的threetenbp或JodaTime的类。

答案 1 :(得分:4)

为了支持并作为对已接受答案的适度补充,下面是ThreeTen-Backport版本,它将适用于Java 6.

LocalDateTime dateTime1 = LocalDateTime.of(2017, Month.JUNE, 28, 8, 0);
LocalDateTime dateTime2 = LocalDateTime.of(2017, Month.JUNE, 28, 10, 0);
System.out.println("\t\t (dateTime2 - dateTime1) = " 
            + Duration.between(dateTime1, dateTime2).toMillis());

打印:

  

(dateTime2 - dateTime1) = 7200000

抱歉,我没有运行Groovy / Grails环境,所以我只给你Java代码,并且必须相信你能够翻译。

你的问题只是关于像Calendar这样过时的课程的另一个问题,这些课程只展示了很多例子中的一个例子,你很容易从中获得意想不到的结果,以及你经常留下的线索很少当这个情况发生时。在您的情况下,获得ThreeTen-Backport,Java 6当然值得考虑。另外,上面的代码也更短,在我看来,更清晰,更自然。