1. ホーム
  2. java

[解決済み] LocalDateからjava.util.Dateへの変換、およびその逆の最も単純な変換?[重複している]。

2022-03-14 05:26:15

質問

を簡単に変換する方法はありますか? LocalDate (Java 8 で導入された) を java.util.Date オブジェクトを作成しますか?

シンプル」というのは、これよりもシンプルという意味です。

Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

というのは、私には少しぎこちないように思えます。

我々は日付の部分にしか興味がなく、どちらのオブジェクトにもタイムゾーンの情報はないので、なぜ明示的にタイムゾーンを導入するのでしょうか?真夜中の時刻とシステムのデフォルトのタイムゾーンを暗黙のうちに変換に利用すべきです。

どのように解決するのですか?

tl;dr

<ブロッククオート

LocalDate (Java 8 で導入) を java.util.Date オブジェクトに変換する簡単な方法はありますか?簡単な」というのは、次のような意味です。

いや。ちゃんと、できるだけ簡潔にやってくれましたね。

java.util.Date.from(                     // Convert from modern java.time class to troublesome old legacy class.  DO NOT DO THIS unless you must, to inter operate with old code not yet updated for java.time.
    myLocalDate                          // `LocalDate` class represents a date-only, without time-of-day and without time zone nor offset-from-UTC. 
    .atStartOfDay(                       // Let java.time determine the first moment of the day on that date in that zone. Never assume the day starts at 00:00:00.
        ZoneId.of( "America/Montreal" )  // Specify time zone using proper name in `continent/region` format, never 3-4 letter pseudo-zones such as “PST”, “CST”, “IST”. 
    )                                    // Produce a `ZonedDateTime` object. 
    .toInstant()                         // Extract an `Instant` object, a moment always in UTC.
)

問題点は以下を読んで、考えてみてください。どうすればもっとシンプルになるのか?ある日付が何時から始まるかと聞かれたら、「どこですか」と聞く以外に答えようがないだろう?パリ(フランス)の夜明けはモントリオール(カリフォルニア)より早く、コルカタ(インド)ではさらに早く、オークランド(ニュージーランド)ではさらに早く、すべて異なる瞬間です。

そのため、日付のみの変換で( LocalDate ) を日付時刻に変換します。 タイムゾーンを適用する ( ZoneId )を取得し、ゾーン化された値( ZonedDateTime )、UTCに移行する( Instant )の定義と一致するように java.util.Date .

詳細

まず、以下のような古いレガシーな日付時刻クラスは避けてください。 java.util.Date 可能な限り。これらは貧弱な設計で、混乱しやすく、厄介なものです。これらのクラスが java.time クラスに取って代わられたのには理由があります。 多く という理由があります。

しかし、どうしても必要な場合は、java.time型と旧型との間で変換することができます。古いクラスに追加された新しい変換メソッドを探してみてください。

java.util.Datejava.time.LocalDate

を覚えておいてください。 java.util.Date は、日付を表すので誤記です。 プラス をUTCで表したものです。これに対して LocalDate クラスは日付のみの値を表し、曜日や時間帯は含まれない。

からの移行 java.util.Date をjava.timeに変換するということは、同等のクラスである java.time.Instant . その Instant クラスは、タイムライン上のある瞬間を UTC の解像度で ナノ秒 (小数点以下9桁まで)。

Instant instant = myUtilDate.toInstant();

LocalDate クラスは日付のみの値を表し、曜日やタイムゾーンは含まれない。

日付を決定する上で、タイムゾーンは非常に重要である。どのような瞬間であっても、日付はゾーンによって世界中に変化します。たとえば、午前0時から数分後に パリ フランス ではまだ「昨日」ですが、新しい日です。 モントリオール ケベック州 .

そこで、その Instant をタイムゾーンに変換します。そこで ZoneId を取得するために ZonedDateTime .

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

そこから、日付指定でお願いする LocalDate .

LocalDate ld = zdt.toLocalDate();

java.time.LocalDatejava.util.Date

から、反対方向に移動すること。 java.time.LocalDate から java.util.Date は、日付のみから日付時刻にすることを意味します。ですから、時間帯を指定しなければなりません。おそらく、その日の最初の瞬間を狙いたいのでしょう。次のようにします。 ではなく とする 00:00:00 . 夏時間のような変則的な場合、最初の瞬間は次のような別の時間になる可能性があります。 01:00:00 . java.timeにその値を決定させるには、次のように呼び出します。 atStartOfDay の上で LocalDate .

ZonedDateTime zdt = myLocalDate.atStartOfDay( z );

ここで Instant .

Instant instant = zdt.toInstant();

変換する Instantjava.util.Date を呼び出すことで from( Instant ) .

java.util.Date d = java.util.Date.from( instant );

詳細情報


について java.time(ジャバタイム

java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、面倒な古い レガシー のような日付時間クラスがあります。 java.util.Date , Calendar , & SimpleDateFormat .

さらに詳しく知りたい方は オラクルチュートリアル . また、Stack Overflowで検索すると、多くの例や解説が見つかります。仕様書は JSR 310 .

ジョダタイム プロジェクトは、現在 メンテナンスモード への移行を推奨しています。 Java.time クラスがあります。

を交換することができます。 java.time オブジェクトを直接データベースとやり取りすることができます。データベースと直接接続するには JDBCドライバ に準拠した JDBC 4.2 またはそれ以降であること。文字列は必要ありません。 java.sql.* クラスがあります。Hibernate 5 & JPA 2.2サポート java.time .

java.timeクラスはどこで手に入りますか?

スリーテン・エキストラ プロジェクトは、java.time を追加クラスで拡張します。このプロジェクトは、将来java.timeに追加される可能性のあるもののための実験場です。ここには、次のような便利なクラスがあります。 Interval , YearWeek , YearQuarter および もっと .