アプリケーションがタイムゾーンを管理する必要がなく、時間を常に UTC で安全に想定できるように、(少なくともサービス層で) LocalDateTime を使用するほぼすべてのインターフェイスを持つことには利点があります。
ここであなたの考え方を理解しているかどうかはわかりません。LocalDateTime
とは、DateTime
まったく異なる 2 つの概念を表しています。aLocalDateTime
に暗黙の UTC タイムゾーンがあるわけではありません。実際にはタイムゾーンがありません(内部的には UTC タイムゾーンを持つ として表される場合がありますがDateTime
、これは単なる実装の詳細であり、それを使用するプログラマーにとっては問題ではありません)。
API ドキュメントを見ると、 aDateTime
は " Instant
" (ワールド タイム ラインのポイント、物理的な概念) ですが、aLocalDateTime
はそのようなものではないことがわかります。はLocalDateTime
、実際にはPartial
、別のクラス階層の (「市民」概念) です。LocalDateTime
残念ながら、クラス名から、これはの特殊化だと思われるかもしれませんがDateTime
、そうではありません。
Aはペア { ( )LocalDateTime
と見なされるべきです。( )}、時間関連データの「市民」標準表現に対応する一連の数値。が与えられた場合、それを に直接変換することはできません。タイムゾーンを指定する必要があります。そしてその変換は私たちを別の種類の実体へと導きます。(類推: Java の文字列とバイト ストリーム: それらの間で変換するには、概念的に異なるものであるため、文字セット エンコーディングを指定する必要があります)Date
Y/M/D
Time
hh:mm:ss.msec
LocalDateTime
DateTime
アプリケーションでどちらを使用するか... 議論の余地がある場合もありますが、Jodatime の概念が理解されると、十分に明確になることがよくあります。また、IMO は「レイヤー」とはあまり関係がなく、おそらくユースケースやシナリオに関連しています。
重要な境界線の例: あなたは Google で働いており、カレンダーをプログラミングしています。ユーザーに日時を含むイベントを管理 (追加、表示、変更) させる必要があります (繰り返し発生するイベントは無視します)。たとえば、「2019 年 7 月 3 日の午前 10 時に医師との予約があります」と言います。ソフトウェア層で使用する日時エンティティは何ですか (このユースケースの場合)? 私はこう言いますLocalDateTime
:ユーザーが実際に扱っているのは物理的な時点ではなく、一般的な時間、つまり手首や自宅の時計に表示される日付と時刻です。彼はタイムゾーンについても考えていません (世界中を旅しているユーザーの特別なケースは無視しましょう...) そして、ビジネスとプレゼンテーション層では、a LocalDateTime
が適切なエンティティのようです。
しかし、別のシナリオ (リマインダー) もコーディングする必要があるとします。Google の内部スケジューラは、ユーザーが保存したイベントが今から N 分先であることを検出すると、ユーザーにリマインダーを送信する必要があります。ここで、「今から N 分後」は完全に「物理的な」時間の概念であるため、「ビジネス層」はDateTime
. たとえば、イベントはDBに保存されましたLocalDateTime
(つまり、タイムゾーンなしの時刻と日付-それを表すためにUTCタイムスタンプを頻繁に使用しますが、これは実装の詳細です)。このシナリオ (これのみ) では、それを としてロードする必要がありDateTime
ます。おそらくユーザーのプロファイルから、タイムゾーンを使用して変換します。