2017-02-02 13 views
5

どちらがいつ、どこでより好ましいですか?Java8:LocalDateTimeまたはTimeStamp

どういう違いがあるのか​​よくわかりません。 LocalDateTime

のドキュメントから

は...時間は精度をナノ秒のために表されています。たとえば、値「2007年10月2日13:45.30.123456789」は、 をLocalDateTimeに格納できます。

私のLocalDateTimeも、私はLocalDateTimeこれらはTimeStampとして宣言されていると私のコードを置き換えることができ、私は思うnanoseconds.Soまで受け入れることができます仮定。私が間違っていれば私を修正してください。

シナリオ:プロジェクトをJava-8でアップグレードする予定でした。 JAVA-8の新機能(例えば、Lambda、Streamsなど)で古いコード・スタイルを変更しました。しかし、日付と時刻を決めているうちに問題が発生しました。 java.util.Dateのコードのほとんどはjava.time.LocalDateまたはjava.time.LocalDateTimeに変更されました。 TimeStampのケースについては、私はその質問については全く考えていません

LocalDateTimeに置き換えてください。

+2

実際の見積もりでは、テキストを引用符で囲んでください。 –

+3

'TimeStamp'はSQL型です。データベースで作業していない場合は、 'java.sql'パッケージで何も使用する必要はありません。 – RealSkeptic

+0

@RealSkepticのケースでは、データベースで作業していませんが、nano秒で使用したい、またはデータベースで作業していますが、フレームワークでjava-8 dataTime api(例:mybatis)を使用することをサポートしています。 ? – Cataclysm

答えて

2

LocalDateTimeと他のJava8タイムクラスを使用することをお勧めします。

  • それらは、ポイント・イン・タイムの定義(Instant)および期間(Duration)またはそのフラグメントベースの定義(LocalDateLocalTime)との間のより明確に分離するという利点を提供します。

  • これらは、操作/計算ロジックのための本当に良いメソッドのセット(java.util.Dateとの違い)を可能にします。

  • 単位変換も(Duration.toDays())です。

  • 最後に、タイムゾーン地獄がカバーされています(ZonedDateTime)。

少し不利な点は、非常に多くのサードパーティ製APIがサポートしていないことです。しかしこれはちょうど時間の問題であり、Java8の時間APIからカレンダー/日付への変換はshowstopperではありません。

成熟したソフトウェアをお持ちの場合は、以前の日付/カレンダーベースのインターフェースをJava8ベースのインターフェースに置き換えることは、上記の利点を活用するまで危険です。あなたはJava8時間ツールボックスから何かを持つ古いTimeStampパラメータを交換したい場合は

あなたはInstantLocalDateTimeまたはZonedDateTimeを使用することができますどちらか。相違点は、Instantの値はZoneOffset.UTCに基づいて計算され、LocalDateTimeはタイムゾーンの関係がないことが条件になります。

ヒント:何かが、例えば、システムのため2018-01-02 10:24:12で起こる必要がある場合LocalDateTimeを使用してはかなりいいところですインドと米国内のシステム。ほとんどの場合、InstantまたはZonedDateTimeを使用して明示的にタイムゾーンを定義することをお勧めします。

3

両方java.util.Dateととjava.sql.TimestampはLocalDateTimeをが現在のタイムゾーンにおける日時であるが、実際に、日付スタンプとインスタントUnix timeのインスタンスではなく、LocalDateTimejava.time.Instantの当量です。あなたは両方のクラスは、(java.util.Dateから継承)この素敵なメソッドを備えていますので、ことをはっきりと見ることができます

java.util.Date::toInstant 

私はあなたがLocalDateDateを置き換えることによって、意味を前提と何があなたが実際にjava.util.Datejava.sql.Dateにない置き換えたです。 sql.Dateはutil.Dateのサブクラスであるにもかかわらず、それが例外をもたらすgetSeconds()を呼び出すとsql.DateがTimeコンポーネントを持たないため、sql.DateはLocalDateに相当し、Instantと同等ではありません。

+0

私の質問としては.. 'java.util.Date'を持つコードの大半は' java.time.LocalDate'または 'java.time.LocalDateTime' *に変更されました。 – Cataclysm

+2

'java.util.Date'には欠けているローカルタイムゾーンの知識も必要なので、' java.util.Date'を 'java.time.LocalDate'で表現するのは正しいとは思いません。もちろん、この特定の 'Date'が' LocalDate'を表すことを絶対に確信したら、是非とも。しかし、あなたのシステムについて知っていることは分かりません。私にとって、 'java.time'と' Date-> Instant'の間で最も失敗しているのは私です。 –

+2

'java.time'より前には、Javaでゾーンに関係のない日時を表す標準的な方法がなかったので、人々は当然' java.util.Date'クラスを使用し、関係なくそれが "インスタンス"か "ローカル日付"かどうか。そのような場合には、それを 'LocalDate'または' LocalDateTime'と置き換えることは理にかなっています。そして、 'LocalDate'は、特定のタイムゾーンに関連付けられていません。そのためには、あなたは 'ZonedDateTime'を持っています。 – RealSkeptic

関連する問題