2017-06-29 49 views
1
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()) = 7199996Milisecond不等於每小時

爲什麼不能7200000毫秒?這裏有點問題。因爲當我從毫秒轉換爲小時時,7199996不是2小時(7200000)

回答

6

您不清除毫秒字段。

添加

cal.clear(); 

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

cal.set(Calendar.MILLISECONDS, 0); 

更一般地,不使用java.util.Calendarjava.util.Date:他們都老了,設計拙劣的班,frought有着名的bug。

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

+0

謝謝。但是我必須在早期版本中使用java 6,我們的低端服務器 – ntlam

+4

「或者來自threetenbp或JodaTime的類。」 –

4

支持和作爲Andy Turner’s answer的一個適度補充,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這樣的過時課程的更多例子,它顯示了很多你從這些中獲得意想不到的結果的多一個例子,以及當這種情況發生時你經常留下的線索有多少。爲您的Java 6獲得ThreeTen Backport肯定值得考慮。最上面的代碼更短,恕我直言更清晰,更自然。