Java Date and Time API¶
はじめに¶
Java Date and Times APIは、Java SE 8から標準化された日時に関する新しいAPIです。それまでのjava.util.Dateクラスおよびjava.util.Calendarクラスを刷新することが目的です。
使い方メモ¶
ローカルタイムのみを扱う場合¶
時差や、サマータイム制などを考慮しなくてもいい場合は、LocalDate、LocalTime、またはLocalDateTimeを使って日付、時刻を扱うことができます。
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);
各国で使用する時刻を扱う場合¶
時刻は、たいてい国ごと、あるいは地域ごとにそれぞれの標準時を定めています。日本であれば、日本標準時がそれにあたります。
UTC(協定世界時)と地方時との差(オフセット)や、夏時間などの考慮が含まれます。ZonedDateTimeクラスを使用します。
2つの日時の間の長さ¶
UTCとのオフセットで時刻を扱う場合¶
UTCとの時刻差を考慮した時刻を扱う場合に、OffsetDateTime、OffsetTimeクラスが使えます。
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()