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);