2017-06-06 31 views
3

日付と時刻の時と分を設定したい。私は3つのソリューションを持っています。カレンダーまたは日付時刻で日付を設定する

どのような理由がありますか? :

バージョン1:

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(date); 
calendar.set(Calendar.MILLISECOND, 0); 
calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.MINUTE, 8); 
calendar.set(Calendar.HOUR, 30); 

return calendar.getTime(); 

バージョン2:

ZonedDateTime i = date.toInstant() 
.atZone(ZoneId.systemDefault()) 
.withHour(8) 
.withMinute(30); 

return Date.from(i.toInstant()); 

バージョン3:

ZonedDateTime i = date.toInstant() 
.atZone(ZoneId.systemDefault()) 
.withHour(8) 
.withMinute(30); 

return new Date(i.toEpochSecond()); 
+3

あなたの最初のバージョンが時間を30に設定しようとしていて、2番目と3番目のバージョンが秒やミリ秒について何もしないのに役立ちません... –

+6

私はバージョン2と言います。 。 – Barend

+0

あなたがそれを修正しても...あなたはどんなメソッドにでも行くことができます – Akshay

答えて

7

バージョン1では、古い古いCalendarクラスを使用しています。もう1つの問題は、JVMの現在のタイムゾーン設定をコード内で明示的に使用することではなく、誰かに不愉快な驚きを与える可能性のある特性です。

バージョン2は新しいクラスを可能な限り利用しており、JVMのタイムゾーン設定の使用については明示的です。良い解決策。

バージョン3にはバージョン2の利点もありますが、変換前のミリ秒単位の変換はDateになります。バージョン2のInstantによる変換は、より自然なので、やや好ましい。

コメントに記載されているように、質問に書かれているバージョン2と3は、秒数と秒数を取り除きません。あなたは完全にも、古くなったDateクラスを使用して避けることができた場合はもちろん、すべての

ZonedDateTime i = date.toInstant() 
      .atZone(ZoneId.systemDefault()) 
      .withHour(8) 
      .withMinute(30) 
      .truncatedTo(ChronoUnit.MINUTES); 

ベスト:(あなたがこれをしたいことを考えると)簡単な解決策はtruncatedTo()を使用することです。

+1

素晴らしい。私は、truncatedToについて知りませんでした:D –

-2

私はバージョンを選択する場合は1

ZonedDateTimeは新しいAPIである私はありませんよく使われる

+4

そのような理由から、*ずっと優れた* java.time APIは使用されていません。 'java.util。'java.util.Date'のように、可能な限りカレンダーは避けるべきです。古いJavaの日付/時刻APIは恐ろしいものでした。 java.timeはかなり良いです。 –

関連する問題