プログラミング原人の進化ログ

プログラミング原人の進化論

オレ プログラミング ベンキョウ スル。マナンダ コト カク。

Javaのtime APIでよく使いそうなクラスとメソッド一覧

今までサボってきた時間情報の取り扱いを勉強したが、忘れそうなのでまとめておきます。自分用のチートシート的な位置付けです。

記事の内容

Dateクラスとかよりも新しい方法が登場しているらしいのでそちらをまとめておきます。
具体的には、java.timeパッケージに属する次のクラスを主に扱います。

  • Instant
  • ZonedDateTime
  • LocalDateTime
  • LocalDate
  • Duration
  • Period

主なクラスの使い道

クラス 説明
Instant 1970年元旦0時ちょうど(Epoch)からの経過ミリ秒を保持する
ZonedDateTime タイムゾーン付き日時をミリ秒まで保持する
LocalDateTime タイムゾーンなし日時をミリ秒まで保持する
LocalDate タイムゾーンなし日時を日単位で保持する
Duration 2つ日時(時刻など短い期間)の間隔を保持する
Period 2つの日時(日付など長めの期間)の間隔を保持する

インスタンを作成するにはnewするのではなくnow(), of(), parse()メソッドを用います。

Duration, Periodのインスタンス生成にはof〇〇()(ofDays, ofMonths()など), between()メソッドを用います。

Period p1 = Period.ofDays(3);

LocalDate day1 = LocalDate.of(2019, 6, 8);
LocalDate day2 = LocalDate.of(2019, 6, 10);

Period p2 = Period.between(day1, day2);

共通のメソッド

とりあえず主要なメソッドの一覧。使い方は後ほど。

メソッド 説明
now() 現在の時刻を保持するインスタンスを生成する
of() 指定した時刻を保持するインスタンを生成する
parse() 指定したフォーマットの文字列を変換した時刻を保持するインスタンスを作成する
format() 時刻を保持するインスタンスを指定したフォーマットで文字列に変換する
get〇〇() 月、日などの個別の情報を取得する
isAfter() 引数の時刻より後かどうか判定する
isBefore() 引数の時刻より前かどうか判定する
plus〇〇() 指定した分だけ進んだ時刻を返す
minus〇〇() 指定した分だけ戻った時刻を返す
plus() 引数に与えた期間だけ進んだ時刻を返す
minus() 引数に与えた期間だけ戻った時刻を返す

タイムゾーンの指定方法

ZondIdオブジェクトを使います。
ZoneIdオブジェクトは次のようにタイムゾーンを引数にして作成します。

ZoneId.of("Asia/Tokyo")

タイムゾーンの一覧は(IANA)[]で確認できます。

get〇〇, plus〇〇, minus〇〇メソッド

〇〇で時間単位を指定します。具体的には次の通り。

getYear(), getMonth(), getDayOfMonath(), getHour(), getMinute(), getSecond(), getNano()

plusYears(), plusMonths, plusDays(), plusHours(), plusMinutes(), plusSeconds(), plusNanos()
(minusはplusと同じ)

各メソッドの使い方

now

クラス名 インスタンス名 = クラス名.now()の形。

Instant i1 = Instant.now();

of

必要なだけの時刻情報を与えます。
下の例は2019年6月8日15時0分0秒0ミリ秒、東京での時刻を保持します。

ZonedDateTime z1 = ZonedDateTime.of(2019, 6, 8, 15, 0, 0, 0, ZoneId.of("Asia/Tokyo"));
LocalDate l1 = LocalDate.of(2019, 6, 8);

parse, format

時刻のオブジェクトを文字列に変換するにはjava.time.format.DateTimeFormatterを使います。 ofPatternメソッドでフォーマットを指定します。

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("西暦yyyy年M月d日");
LocalDate day = LocalDate.parse("西暦2019年6月8日", dtf);
String strDay = day.format(dtf);

get〇〇

返り値はint型みたいです。

LocalDate date = LocalDate.of(2019, 6, 8);
int y = date.getYear();

isAfter, isBefore

真偽値が返ります。

LocalDate day1 = LocalDate.of(2019, 5, 8);
LocalDate day2 = LocalDate.of(2019, 6, 8);
System.out.println(day1.isAfter(day2));  // false
System.out.println(day1.isBefore(day2));   // true

plus〇〇, minus〇〇

LocalDate day1 = LocalDate.of(2019, 5, 8);
LocalDate day2 = day1.plusDays(3);  
LocalDate day3 = day1.minusYears(1);  

plus, minus

LocalDateTime time1 = LocalDateTime.of(2019, 6, 8, 15, 0, 0, 0);
Duration d = Duration.ofHours(3);
Period p = Period.ofDays(3);
LocalDateTime time2 = time1.plus(d);
LocalDateTime time3 = time1.minus(p);

参考

中山清喬(2014)「スッキリわかるJava入門 実践編」株式会社インプレス