Java8のLocalDateとLocalDateTimeを変換してみた

Java8のLocalDateとLocalDateTimeを変換してみた

Java8からLocalDateクラスというのが追加されていて色々調べてみました。

インスタンス生成方法はLocalDate.ofを使って生成します。

デフォルトはyyyy-MM-dd形式になります。ofメソッドでleap year(うるう年)の判定もしてくれるのでnew LocalDate(2019,2,29);なんてするとエラーが発生します。

今の時間でLocalDateを生成するにはnow()メソッドを使用します。

LocalDateもLocalDateTimeもタイムゾーンがないのでOSの日時を変更するとその時刻が表示されます。

LocalDateTimeからLocalDateに変換する

2022/05/15追記

java.time.temporal.TemporalAccessorインタフェースを使用して、LocalDateTimeからLocalDateに変換することができるようです。

LocalDateの加算減算

LocalDateに日数を加算したい減算したいというケースが出てくると思います。

その場合はplusDays(int)やminusDays(int)で加減算することができます。基本的に用意されているメソッドは同じです。LocalDateTimeは時分秒を加減算するメソッドがあります。

LocalDateとLocalDateを比較する

「2000年1月1日より未来日のデータを取得する」みたいな感じでLocalDate同士を比較するときがあると思います。

その場合はisAfterやisBeforeメソッドを使用します。

isAfterやisBeforeメソッドは同一日を含まないので、「2000年1月1日含む未来日のデータを取得する」という場合はequalsメソッドを併用しないと期待した動きとなりません。

日付フォーマットする

LocalDateもLocalDateTimeも日付フォーマットするには、DateTimeFormatterクラスを使用します。戻り値はString型になります。

parseメソッドを使用して日付フォーマットする

formatメソッドだとString型に変換されてしますので、LocalDate.parseメソッドを使用して日付フォーマットします。この場合は戻り値はLocalDate型になります。

良きに計らってくれるようですが、第一引数が文字列で動的に来ると考えると、エラーとしたい場合があると思います。

その場合はyyyyをuuuuに変更してwithResolverStyle(ResolverStyle.STRICT)メソッドを指定します。

DateTimeFormatterのhhとHHの違い

形式 表示
hh 1~12
HH 0~23

上記の通りです。hhは0~11ではなく1~12のようです。

23と指定するとエラーとならずに11になってしまいます。

HHで指定すると23は23として表示されます。

ちなみにこれをLocalDateTime.parseメソッドで行うとエラーとなります。

LocalDateとLocalDateの比較

LocalDateとLocalDateの比較にはequalsメソッドを使用します。(isEqualメソッドでも可能)

Periodクラス

日にちを扱っているとjava.time.Periodクラスも出てくると思います。

Periodクラスは日にちの量を表すクラスで、betweenメソッドやofメソッドでインスタンス生成します。以下、betweenメソッドを使用しています。

toTotalMonthsメソッドは9年1ヶ月=109ヶ月を返します。その他はメソッド名通りです。

以下、ofメソッドを使用しています。

Durationクラス

Periodクラスに対してDurationクラスは時間の量を表すクラスです。

以下、betweenメソッドを使用しています。

LocalDateをLocalDateTimeの00:00を求めるatStartOfDayメソッド

LocalDateからLocalDateTimeに変換する方法として、00:00にするのならatStartOfDayメソッドを使用することでその日にちの00:00のLocalDateTimeに変換することができます。

OffsetDateTimeクラス

OffsetDateTimeクラスは時差ありの日付を表すクラスです。

2020-09-15T19:16:39.265866700+09:00というようにJSTの場合+09:00がついたり、UTCの場合は2020-09-15T10:16:39.265866700Zというように末尾にZが付きます。

また、LocalDateTimeのインスタンスをOffsetDateTimeクラスのインスタンスに変換することも可能です。

タイムゾーン付きの文字列の日付をLocalDateTimeに変換する

タイムゾーン付きの文字列の日付をLocalDateTimeに変換する例です。

ZonedDateTime,ZoneIdクラスを使用します。

一旦UTCに変換すれば時間はわかりやすいと思います。

JST UTC 結果
2020/12/30 09:00:00+0900 2020/12/30 00:00:00Z 違う時間
2020/12/30 10:00:00+0900 2020/12/30 01:00:00Z 同じ時間
2020/12/30 09:00:00+0800 2020/12/30 01:00:00Z 同じ時間

UTCに変換すれば同じ時間であることがわかります。

文字列の日付妥当性チェック

文字列の日付が厳密に妥当かどうかをparseメソッドでチェックするメソッドです。

LocalDateTimeをjava.util.Dateに変換

あまりこの変換をするケースはないと思いますが、以下のようにtoDateメソッドを使用して変換することが出来ます。

日付の過去未来の複数条件の判定

複数条件の日付判定を書くときは、isAfterやisBeforeを使います。

父の誕生日>母の誕生日>兄の誕生日>弟の誕生日」の整合性が取れている確認です。

streamとallMatchメソッドを使って書いています。

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメント

  1. 佐藤哲也 より:

    LocalDateTime から LocalDate に変換するのは、 LocalDate.from(TemporalAccessor) を使うのが手っ取り早いと思います。
    LocalTime への変換も同様ですね。

コメントをどうぞ

メールアドレスが公開されることはありません。

CAPTCHA