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に変換する

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クラスのインスタンスに変換することも可能です。

package jp.co.offsetdatetimes;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class OffsetDateTimeSample {
public static void main(String[] args) {
// JST表示
OffsetDateTime odtjst = OffsetDateTime.now(ZoneId.of("Asia/Tokyo")); // JST
System.out.println(odtjst); // 2020-09-15T19:16:39.265866700+09:00
// JSTをUTCに変換
OffsetDateTime odtutc = OffsetDateTime.ofInstant(odtjst.toInstant(), ZoneId.of("UTC")); // UTC
System.out.println(odtutc); // 2020-09-15T10:16:39.265866700Z
// LocalDateTimeをOffsetDateTimeに変換
LocalDateTime ldt = LocalDateTime.now();
ZoneOffset offset = ZoneId.of("UTC").getRules().getOffset(odtjst.toInstant());
OffsetDateTime odt = OffsetDateTime.of(ldt, offset);
System.out.println(odt); // 2020-09-15T19:16:39.265866700Z
}
}

view raw
Sample.java
hosted with ❤ by GitHub

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

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA