2017-06-29 4 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ミリ秒に等しくありませんか?ここに何か間違っています。ミリ秒から1時間に変換すると、7199996は2時間ではないため(7200000)

答えて

6

ミリ秒フィールドをクリアしていません。彼らは、古い、下手に設計されたクラスですfrought:

cal.clear(); 
cal.set(...);ラインの前

、または、より一般的に


cal.set(Calendar.MILLISECONDS, 0); 
を追加 java.util.Calendarjava.util.Dateを使用していない追加よく知られているバグがあります。

Java 8で導入されたjava.timeパッケージのクラスを使用します。以前のバージョンのJavaではthreetenbpまたはJodaTimeのクラスを使用します。

+0

ありがとうございます。しかし私は、Java 6、ローエンドのサーバ – ntlam

+4

"または以前のバージョンではthreetenbpまたはJodaTimeのクラスを使用する必要があります。 –

4

Andy Turner’s answerの控えめな補足として、ThreeTenバックポートバージョン。それが印刷さ

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()); 

のJava 6で動作します:

私が実行しているGroovyの/ Grailsの環境を持っていないので、私はあなたにだけ、Javaコードを与えていると信頼する必要があります
 (dateTime2 - dateTime1) = 7200000 

申し訳ありません翻訳する。

あなたの質問は、あなたがこれらの予期しない結果を取得し、どのように少しの手がかりのこの問題が発生したときには、多くの場合が残っているか簡単に、非常に多くのうちのひとつ以上の例を示しCalendarのような時代遅れのクラスについてのもう一つだけです。 Java 6のThreeTen Backportを入手することは、確かに検討する価値があります。上に、上記のコードは短く、IMHOはより明確で自然です。