LoginSignup
1
5

More than 5 years have passed since last update.

Java 8の日付/時刻APIのうち頻繁に使いそうなモノだけの簡潔なまとめ

Last updated at Posted at 2017-10-27

Java 8の日付/時刻APIについて、実務的に使う頻度の高そうなモノだけを簡潔にまとめました。

java.time.LocalDateクラス

リファレンス

  • 特徴
    • LocalDateはimmutable(Calenderはmutableだった)
    • Calenderでは月が0から始まっていたが、LocalDateは1から始まる
      • 月に0を渡すと存在しない日付なので実行時エラーになる
  • インスタンス生成系の便利メソッド
    • now
    • of
    • parse
LocalDate a = LocalDate.now();
System.out.println(a); // YYYY-MM-DD

LocalDate b = LocalDate.of(2017, 10, 17);
System.out.println(b); // 2017-10-17

LocalDate c = LocalDate.parse("2017-10-17");
System.out.println(c); // 2017-10-17
System.out.println(c.getYear()); // 2017
System.out.println(c.getMonthValue()); // 10
System.out.println(c.getDayOfMonth()); // 17
System.out.println(c.getDayOfWeek()); // "TUESDAY"
System.out.println(c.getDayOfWeek().getValue()); // 2

LocalDate d = c.plusDays(30);
System.out.println(c); // 2017-10-17 ※immutableなので元の値は変わらない
System.out.println(d); // 2017-11-16

java.time.LocalTimeクラス

リファレンス

  • LocalTimeはimmutable
  • 24時間で時間を扱い、午前/午後は区別しない
LocalTime a = LocalTime.of(0, 1, 2);
System.out.println(a); // 00:01:02

LocalTime b = a.plusHours(12);
System.out.println(a); // 00:01:02 ※immutableなので元の値は変わらない
System.out.println(b); // 12:01:02

java.time.LocalDateTimeクラス

リファレンス

  • 基本的な仕様はLocalDate / LocalTimeと同じ

java.time.format.DateTimeFormatterクラス

リファレンス

  • LocalDate / LocalTime / LocalDateTime とも、formatメソッドで使う
  • DateTimeFormatterクラスに定義されている定数(フォーマッター)を引数にできる
フォーマッター
BASIC_ISO_DATE 20171017
ISO_LOCAL_DATE 2017-10-17
ISO_LOCAL_TIME 10:15:30
LocalDateTime dateTime = LocalDateTime.of(2017, 10, 17, 10, 15, 30);
System.out.println(dateTime.format(DateTimeFormatter.BASIC_ISO_DATE)); // 20171017
System.out.println(dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2017-10-17
System.out.println(dateTime.format(DateTimeFormatter.ISO_LOCAL_TIME)); // 10:15:30

java.time.Durationクラス

リファレンス

  • 日付の差、時刻の差を取得できる
LocalDateTime start = LocalDateTime.of(2017, 10, 17, 0, 0);
LocalDateTime end = LocalDateTime.of(2017, 11, 17, 0, 0);
Duration d = Duration.between(start, end);
System.out.println(d.toDays()); // 31(日)
System.out.println(d.toHours()); // 744(時間)

(参考&注意)
Java 8にはjava.time.Periodクラスという、期間を取得するためのAPIもあります。
ところが、このAPIは、期間を「○年と○ヶ月と○日」という形式で求めるモノです。
いわゆる「日数」を取得する目的で利用すると期待結果と異なるので、勘違いしないように注意しなければなりません。

LocalDate start = LocalDate.of(2017, 10, 17);
LocalDate end = LocalDate.of(2017, 11, 17);
Period p = Period.between(start, end);
System.out.println(p.getMonths()); // 1ヶ月
System.out.println(p.getDays()); // 0日 (注)期待結果を「31日」と想定しているとバグる
1
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5