日付をLocalDateまたはLocalDateTimeに変換して元に戻す
1. 概要
Java 8以降、新しいDateAPIがあります:java.time。
ただし、新しいAPIと古いAPIの間で変換を実行し、両方の日付表現を処理する必要がある場合もあります。
2. java.util.Dateをjava.time.LocalDateに変換しています
古い日付表現を新しい表現に変換することから始めましょう。
ここでは、Java8のjava.util.Dateに追加されたnew toInstant()メソッドを利用できます。
Instant オブジェクトを変換する場合、Instantオブジェクトはタイムゾーンに依存しないであるため、ZoneIdを使用する必要があります。
InstantオブジェクトのatZone(ZoneId zone)APIはZonedDateTime を返すため、LocalDateをLocalDateを使用して抽出する必要があります。 X164X] toLocalDate()メソッド。
まず、デフォルトのシステムZoneIdを使用しています。
public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
}
同様のソリューションですが、Instantオブジェクトを作成する方法が異なります — ofEpochMilli()メソッドを使用します。
public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {
return Instant.ofEpochMilli(dateToConvert.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDate();
}
先に進む前に、 old java .sql.Date クラスと、それをLocalDateに変換する方法についても簡単に見てみましょう。
Java 8以降、 java.sql.Dateに追加のtoLocalDate()メソッドがあります。これにより、java.timeに簡単に変換することもできます。 .LocalDate。
この場合、タイムゾーンについて心配する必要はありません。
public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}
同様に、古いDateオブジェクトをLocalDateTimeオブジェクトに変換することもできます。 次にそれを見てみましょう。
3. java.util.Dateをjava.time.LocalDateTimeに変換しています
LocalDateTime インスタンスを取得するには、同様に中間のZonedDateTimeを使用してから、toLocalDateTime()APIを使用できます。
前と同じように、2つの可能な解決策を使用して、java.util.DateからInstantオブジェクトを取得できます。
public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) {
return Instant.ofEpochMilli(dateToConvert.getTime())
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
}
1582年10月10日より前の日付の場合、Calendarをグレゴリオ暦として設定し、メソッド setGregorianChange():を呼び出す必要があることに注意してください。
GregorianCalendar calendar = new GregorianCalendar();
calendar.setGregorianChange(new Date(Long.MIN_VALUE));
Date dateToConvert = calendar.getTime();
また、Java 8以降では、java.sql.Timestampを使用してLocalDateTimeを取得することもできます。
ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {
return new java.sql.Timestamp(
dateToConvert.getTime()).toLocalDateTime();
}
4. java.time.LocalDateをjava.util.Dateに変換します
古いデータ表現から新しいデータ表現に変換する方法を十分に理解したので、別の方向への変換を見てみましょう。
LocalDateをDateに変換する2つの可能な方法について説明します。
最初に、 java.sql.Dateオブジェクトで提供される新しいvalueOf(LocalDate date)メソッドを使用します。このメソッドは、LocalDateをパラメーターとして受け取ります。
public Date convertToDateViaSqlDate(LocalDate dateToConvert) {
return java.sql.Date.valueOf(dateToConvert);
}
ご覧のとおり、簡単で直感的です。 変換にはローカルタイムゾーンを使用します(すべてが内部で行われるため、心配する必要はありません)。
別のJava8の例では、[X31X] from(Instant Instant)メソッドの
public Date convertToDateViaInstant(LocalDate dateToConvert) {
return java.util.Date.from(dateToConvert.atStartOfDay()
.atZone(ZoneId.systemDefault())
.toInstant());
}
ここではInstantオブジェクトを使用していることに注意してください。また、この変換を行うときはタイムゾーンにも注意する必要があります。
次に、非常によく似たソリューションを使用して、LocalDateTimeをDateオブジェクトに変換してみましょう。
5. java.time.LocalDateTimeをjava.util.Dateに変換します
LocalDateTimeからjava.util.Dateを取得する最も簡単な方法は、 java.sql.Timestamp の拡張機能を使用することです—Java8で使用できます。
public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
return java.sql.Timestamp.valueOf(dateToConvert);
}
ただし、もちろん、別の解決策は、ZonedDateTimeから取得したInstantオブジェクトを使用することです。
Date convertToDateViaInstant(LocalDateTime dateToConvert) {
return java.util.Date
.from(dateToConvert.atZone(ZoneId.systemDefault())
.toInstant());
}
6. Java9の追加
Java 9には、java.util.Dateとjava.time.LocalDateまたはjava.time.LocalDateTime間の変換を簡素化する新しいメソッドがあります。
LocalDate.ofInstant(インスタントインスタント、ZoneIdゾーン)および LocalDateTime.ofInstant(インスタントインスタント、ZoneIdゾーン)は便利なショートカットを提供します。
public LocalDate convertToLocalDate(Date dateToConvert) {
return LocalDate.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
public LocalDateTime convertToLocalDateTime(Date dateToConvert) {
return LocalDateTime.ofInstant(
dateToConvert.toInstant(), ZoneId.systemDefault());
}
7. 結論
この記事では、古いjava.util.Dateを新しいjava.time.LocalDateおよびjava.time.LocalDateTimeに変換する方法についても説明しました。逆に。
この記事の完全な実装は、GitHubでから入手できます。