概要
かつて使われていたjava.util.Dateクラス、java.util.Calendarクラスは以下のような問題があるため現在では使われていない。
- 月が0から始まるなど使いづらい
- スレッドセーフではない
- 期間を表すことができない
現在は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));
コメント