Java 日時APIについて

日時APIについて調べてみた

・日時クラス

// LocalDateTime タイムゾーンなし
System.out.println(LocalDateTime.now()); // ex 2019-04-12T23:41:14.816

// ZonedDateTime タイムゾーン付き
System.out.println(ZonedDateTime.now()); // ex 2019-04-12T23:42:07.975+09:00[GMT+09:00]

// OffsetDateTime オフセット付き
System.out.println(OffsetDateTime.now()); // ex 2019-04-12T23:42:36.609+09:00

インスタンス生成

// now 現在日時
System.out.println(LocalDateTime.now());

// of
System.out.println(LocalDateTime.of(9999, 12, 31, 23, 59, 59, 999999999)); // ex 9999-12-31T23:59:59.999999999

・日時クラス間の変換

// atZone
System.out.println(LocalDateTime.now().atZone(ZoneOffset.systemDefault()));

// atOffset
System.out.println(LocalDateTime.now().atOffset(ZoneOffset.ofHours(9)));

// toInstant
System.out.println(LocalDateTime.now().toInstant(ZoneOffset.ofHours(9)));

// LocalDate
System.out.println(LocalDateTime.now().toLocalDate()); // ex 2019-04-12

// LocalTime
System.out.println(LocalDateTime.now().toLocalTime()); // 23:45:02.682

// ofInstant
Date date = new Date();
System.out.println(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()));

// from
System.out.println(LocalDateTime.from(ZonedDateTime.now()));

System.out.println(LocalDateTime.from(OffsetDateTime.now()));

・日時クラスのパラメータ

// ZoneId
System.out.println(ZoneId.of("Asia/Tokyo"));
System.out.println(ZoneId.systemDefault()); // ex GMT+09:00

// ZoneOffset
System.out.println(ZoneOffset.ofHours(9));

// isSupported ChronoField フィールドの標準セット
System.out.println(LocalDateTime.now().isSupported(ChronoField.YEAR));
System.out.println(LocalDateTime.now().isSupported(ChronoField.MONTH_OF_YEAR));
System.out.println(LocalDateTime.now().isSupported(ChronoField.DAY_OF_MONTH));
System.out.println(LocalDateTime.now().isSupported(ChronoField.HOUR_OF_DAY));
System.out.println(LocalDateTime.now().isSupported(ChronoField.MINUTE_OF_HOUR));
System.out.println(LocalDateTime.now().isSupported(ChronoField.SECOND_OF_MINUTE));
System.out.println(LocalDateTime.now().isSupported(ChronoField.NANO_OF_SECOND));
System.out.println(LocalDateTime.now().isSupported(ChronoField.DAY_OF_WEEK));

// range
System.out.println(LocalDateTime.now().range(ChronoField.YEAR));              // -999999999 - 999999999
System.out.println(LocalDateTime.now().range(ChronoField.MONTH_OF_YEAR));    // 1 - 12
System.out.println(LocalDateTime.now().range(ChronoField.DAY_OF_MONTH));     // 1 - 30(31では?)
System.out.println(LocalDateTime.now().range(ChronoField.HOUR_OF_DAY));      // 0 - 23
System.out.println(LocalDateTime.now().range(ChronoField.MINUTE_OF_HOUR));   // 0 - 59
System.out.println(LocalDateTime.now().range(ChronoField.SECOND_OF_MINUTE)); // 0 - 59
System.out.println(LocalDateTime.now().range(ChronoField.NANO_OF_SECOND));   // 0 - 999999999
System.out.println(LocalDateTime.now().range(ChronoField.DAY_OF_WEEK));      // 1 - 7

// isSupported ChronoUnit 日時期間の単位の標準セット
System.out.println(LocalDateTime.now().isSupported(ChronoUnit.YEARS));
System.out.println(LocalDateTime.now().isSupported(ChronoUnit.MONTHS));
System.out.println(LocalDateTime.now().isSupported(ChronoUnit.DAYS));
System.out.println(LocalDateTime.now().isSupported(ChronoUnit.HOURS));
System.out.println(LocalDateTime.now().isSupported(ChronoUnit.MINUTES));
System.out.println(LocalDateTime.now().isSupported(ChronoUnit.SECONDS));
System.out.println(LocalDateTime.now().isSupported(ChronoUnit.NANOS));
System.out.println(LocalDateTime.now().isSupported(ChronoUnit.WEEKS));

・値の取得

System.out.println(LocalDateTime.now().getYear());
System.out.println(LocalDateTime.now().getMonth());//ex APRIL
System.out.println(LocalDateTime.now().getMonthValue()); // 1-12
System.out.println(LocalDateTime.now().getDayOfMonth());
System.out.println(LocalDateTime.now().getHour());
System.out.println(LocalDateTime.now().getMinute());
System.out.println(LocalDateTime.now().getSecond());
System.out.println(LocalDateTime.now().getNano());
System.out.println(LocalDateTime.now().getDayOfWeek());
System.out.println(LocalDateTime.now().getDayOfYear()); // 1-365

// get/getLong フィールド指定
System.out.println(LocalDateTime.now().get(ChronoField.YEAR));     // int
System.out.println(LocalDateTime.now().getLong(ChronoField.YEAR)); // long

// format フォーマット指定
System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy")));

// truncatedTo 切り捨て指定、指定したunitまで取得
System.out.println(LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));

// until
LocalDateTime tomorrow = LocalDateTime.now().plusDays(1);
System.out.println(LocalDateTime.now().until(tomorrow, ChronoUnit.DAYS)); // 1

・比較

// compareTo ※エポック比較ではない
LocalDateTime now = LocalDateTime.now();
System.out.println(tomorrow.compareTo(now)); // 1
System.out.println(now.compareTo(tomorrow)); // -1
System.out.println(now.compareTo(now)); // 0

// equals ※エポック比較ではない
// 属性判定
System.out.println(now.equals(now)); // true
System.out.println(tomorrow.equals(now)); // false

// isAfter
// エポック比較
System.out.println(tomorrow.isAfter(now)); // true
System.out.println(now.isAfter(tomorrow)); // false

// isBefore
// エポック比較
System.out.println(now.isBefore(tomorrow)); // true
System.out.println(tomorrow.isBefore(now)); // false

// isEqual
// エポック比較
System.out.println(now.isEqual(now)); // true
System.out.println(tomorrow.isBefore(now)); // false

・編集

// plus
System.out.println(LocalDateTime.now().plusDays(1));

// minus
System.out.println(LocalDateTime.now().minusDays(1));

// with(set)
System.out.println(LocalDateTime.now().withDayOfMonth(1));