[Java] 日時を扱うクラスの使い方

スポンサーリンク

概要

かつて使われていたjava.util.Dateクラス、java.util.Calendarクラスは以下のような問題があるため現在では使われていない。

  1. 月が0から始まるなど使いづらい
  2. スレッドセーフではない
  3. 期間を表すことができない

現在はJava8から追加されたTime API(java.timeパッケージ)が使われる。
Time APIのクラスはnewが禁止されており、静的メソッドのnow()やof()を使ってインスタンスを生成する。

java.time.LocalDateTimeクラス

LocalDateTime z1 = LocalDateTime.now();
LocalDateTime z2 = LocalDateTime.of(2020, 1, 2, 3, 4, 5, 6);
System.out.println(z1.getMonthValue()); // 月は1〜12
System.out.println(z2.Year());

内部にタイムゾーンを含んだjava.time.ZonedDateTimeクラスもあるが、単に日時を扱う場合はjava.time.localDateTimeで十分なためjava.time.ZonedDateTimeを使うことはほとんどない。

和暦を扱うAPI

java.time.chrono.JapaneseDateクラスで和暦を表示することができる。

System.out.println(JapaneseDate.of(2023, 1, 1)); // Japanese Reiwa 5-01-01
System.out.println(JapaneseDate.of(2023, 1, 1).getEra()); // Reiwa

期間を表すクラス

時間はjava.time.Durationクラス、年・月・日などはjava.time.Periodクラスを使う。
ofXxx()やbetween()でインスタンスを生成することができる。

Duration d1 = Duration.ofHours(5);
Duration d2 = Duration.ofMinutes(30);
Duration d3 = Duration.between(LocalDateTime.of(2019, 1, 1, 12, 30, 0, 0), LocalDateTime.of(2020, 9, 23, 6, 15, 30, 0));
Period p1 = Period.ofMonths(3);
Period p2 = Period.ofDays(30);
Period p3 = Period.between(LocalDate.of(2023, 1, 1), LocalDate.of(2023, 1, 4));

コメント