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毫秒?
答案 0 :(得分:6)
您没有清除毫秒字段。
添加
cal.clear();
在cal.set(...);
行之前,或添加
cal.set(Calendar.MILLISECONDS, 0);
更一般地说,不要使用java.util.Calendar
和java.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当然值得考虑。另外,上面的代码也更短,在我看来,更清晰,更自然。