プロジェクト

全般

プロフィール

Java Date and Time API

はじめに

Java Date and Times APIは、Java SE 8から標準化された日時に関する新しいAPIです。それまでのjava.util.Dateクラスおよびjava.util.Calendarクラスを刷新することが目的です。

使い方メモ

ローカルタイムのみを扱う場合

時差や、サマータイム制などを考慮しなくてもいい場合は、LocalDate、LocalTimeを使って日付、時刻を扱うことができます。

LocalDate

時分秒は含まず日付(年月日)を表現します。誕生日とか記念日、開催日などで時分秒を問わない情報を表現するのに有用です。

生成
LocalDate today = LocalDate.now(); // プログラムを実行した日
LocalDate theDay = LocalDate.of(2016, 1, 6); // 2016年1月6日
LocalDate theOtherDay = LocalDate.of(2015, Month.DECEMBER, 25); // 2015年12月25日、月をenum型で指定

LocalDateはイミュータブルオブジェクトとして設計されています。一度インスタンスを生成したらその値を変えることができません。

年、月、日の値の取り出し
int year = today.getYear();              // 年の値の取り出し
int monthValue = today.getMonthValue();  // 月の値の取り出し
int day = today.getDayOfMonth();         // 日の値の取り出し
Month month = today.getMonth();  // enum型で月を取り出し

2つの日付の間の長さ

期間

年、月、日単位である時刻と別な時刻との間の長さを表すPeriodを使います。

Period period = Period.between(theOtherDay, theDay);
int days = period.getDays();
時間

時分秒単位である時刻と別な時刻との間の長さをChronoUnitで表現します。
時間単位で表現する場合は、ChronoUnit.HOURS を使います。

LocalDateTime now = LocalDateTime.now();
LocalDateTime closing = LocalDateTime.of(2016, 1, 9, 23, 59);

long hours = ChronoUnit.HOURS.between(now, closing);

APIの実装

Instant

Instant.now

Instant.now()
  Cloclk.systemUTC()
    new SystemClock(ZoneOffset.UTC)    
    SystemClock#instant()
      SystemClock#millis()
        System.currentTimeMillis()  *1
      Instant.ofEpochMillis(*1)
        Math.floorDiv  *2
        Math.floorMod  *3
        Instant#create(*2, *3)
          new Instant(*2, *3)

LocalTime

LocalTime.now

LocalTime.now()
  Clock.systemDefaultZone()
    ZoneId.systemDefault()
      TimeZone.getDefault()
        TimeZone.getDefaultRf()
        Timezone#clone()
      TimeZone#toZoneId()
        ZoneId.of(*, ZoneId.SHORT_IDS)
    new SystemClock(*)
  LocalTime.now(*)
    Clock.system(*)
      new SystemClock(*)
    LocalTime.now(*)
      Clock#instant()
      Clock#getZone()
      getRules()
      getOffset(*)
      Math.floorMod
      ofNanoOfDay()

クリップボードから画像を追加 (サイズの上限: 1 GB)