連載
» 2014年12月17日 18時00分 公開

ImmutableでスレッドセーフになったJavaの新しい日時APIの基礎知識ここが大変だよJava 8 Date-Time API(1)(3/5 ページ)

[長谷川智之,株式会社ビーブレイクシステムズ]

日付および時刻を表すJava 8のクラス

 Date-Time APIでは私たちが一般的に認識している日付や時刻(年、月、日、時、分、秒、ナノ秒)の単位で扱うさまざまなクラスが用意されています。特に旧日時APIのjava.util.Dateクラスやjava.util.Calendarクラスとは違い、例えば、日付だけ扱いたい場合や時刻のみ扱いたい場合など、Date-Time APIではさまざまな用途に合ったクラスを用意しています。

 それでは、どのようなクラスが用意されているか見てみましょう。

DateTime(日時を表すクラス)

 java.timeパッケージに用意されている日付および時刻(年、月、日、時、分、秒、ナノ秒)を表すクラスは次のものになります。

クラス 概要
LocalDateTime タイムゾーンやUTCからの時差の設定がない西暦の日付と時刻(年、月、日、時、分、秒、ナノ秒)を扱うクラス
ZonedDateTime 同じ標準時を持つ地域のタイムゾーンを表すZoneIdの情報と日付と時刻の情報を扱うクラス。指定したZoneIdよりその地域の時差の情報を持ち、また、サマータイム制などその地域特有のZoneRulesの情報も持っている
OffsetDateTime UTCからの時差を表すZoneOffsetの情報と日付と時刻の情報を扱うクラス。ただし、ZonedDateTimeと違いサマータイム制などその地域特有のZoneRulesの情報は持っていない
LocalDateTime localDateTime = LocalDateTime.of(2010, Month.JANUARY, 1, 12, 10, 10, 10);
System.out.println("localDateTime=" + localDateTime);
 
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("America/New_York"));
System.out.println("zonedDateTime=" + zonedDateTime);
 
OffsetDateTime offsetDateTime = OffsetDateTime.of(localDateTime, ZoneOffset.of("+04:00"));
System.out.println("offsetDateTime=" + offsetDateTime);
サンプル
localDateTime=2010-01-01T12:10:10.000000010
zonedDateTime=2010-01-01T12:10:10.000000010-05:00[America/New_York]
offsetDateTime=2010-01-01T12:10:10.000000010+04:00
実行結果

 また、これらのクラスは、お互い別のクラスに、ZoneIdやZoneOffsetを設定することにより、タイムゾーンや時差の情報を持ったZonedDateTimeクラスやOffsetDateTimeクラスに変換することが可能です。また、逆に自身の持つタイムゾーンや時差の情報を除くことにより、それらの情報を持たないクラスに変換することも可能です。

LocalDateTimeから他のDateTimeクラスを生成するメソッド
戻り値 メソッド 概要
ZonedDateTime atZone(ZoneId zoneId) 呼び出したLocalDateTimeの情報に引数のZoneIdのタイムゾーンの情報が設定されたZonedDateTimeを生成するメソッド
OffsetDateTime atOffset(ZoneOffset offset) 呼び出したLocalDateTimeの情報に引数のZoneOffsetの時差の情報が設定されたOffsetDateTimeを生成するメソッド
ZonedDateTimeから他のDateTimeクラスを生成するメソッド
戻り値 メソッド 概要
LocalDateTime toLocalDateTime() 呼び出したZonedDateTimeの情報からZoneIdの情報をなくして年、月、日、時、分、秒、ナノ秒が設定されたLocalDateTimeを生成するメソッド
OffsetDateTime toOffsetDateTime() 呼び出したZonedDateTimeの情報からZoneIdの情報をなくし、ZoneOffsetの情報が設定されたOffsetDateTimeを生成するメソッド
OffsetDateTimeから他のDateTimeクラスを生成するメソッド
戻り値 メソッド 概要
LocalDateTime toLocalDateTime() 呼び出したOffsetDateTimeの情報から時差(ZoneOffset)の情報をなくして年、月、日、時、分、秒、ナノ秒が設定されたLocalDateTimeを生成するメソッド
ZonedDateTime toZonedDateTime() 呼び出したOffsetDateTimeの情報から時差(ZoneOffset)の情報をZoneIdとして持ち、かつ年、月、日、時、分、秒、ナノ秒が設定されたZonedDateTimeを生成するメソッド(※ここで生成されたZoneIdには「地域/都市」のIdではなくUTCからの時差の文字列をZoneIdとして持つ)
ZonedDateTime atZoneSimilarLocal(ZoneId zoneId) 呼び出したOffsetDateTimeの年、月、日、時、分、秒、ナノ秒の情報をそのまま持ち、タイムゾーンの情報を引数のzoneIdが設定されたZonedDateTimeを生成するメソッド
ZonedDateTime atZoneSameInstant(ZoneId zoneId) 呼び出したOffsetDateTimeが持つ同じInstant(エポックからの経過秒の情報を持っているクラス)から引数のzoneIdの情報が設定されたZonedDateTimeを生成するメソッド。そのため、日、時、分は指定するzoneIdによって変わることもある

Date(年月日を表すクラス)

 java.timeパッケージに用意されている日付(年、月、日)を表すクラスは次のLocalDateのみになります。このクラスには時刻である時、分、秒、ナノ秒の要素は待っていません。

クラス 概要
LocalDate タイムゾーンやUTCからの時差など情報を持たない年、月、日の日付の情報を持つクラス

 また、日時を表す各DateTimeのクラスからLocalDateクラスを取得するためのメソッドが用意されています。

メソッド 概要
toLocalDate 各DateTimeのクラスが持つ年、月、日の情報からLocalDateを生成するメソッド

 逆にLocalDateから各DateTimeを生成する主なメソッドに次のものが用意されています。

戻り値 メソッド 概要
LocalDateTime atStartDay() LocalDateの年、月、日の情報、および、その日の始まり(0時0分0秒0ナノ秒)の情報が設定されたLocalDateTimeを生成するメソッド
ZonedDateTime atStartDay(ZonedId zoneId) LocalDateの年、月、日および、その日の始まり(0時0分0秒0ナノ秒)の情報に、引数のzoneIdからタイムゾーンの情報が設定されたZonedDateTimeを生成するメソッド
LocalDateTime atTime(LocalTime time) LocalDateの年、月、日の情報に引数で指定したtimeの時、分、秒、ナノ秒の情報が設定されたLocalDateTimeを生成するメソッド
OffsetDateTime atTime(OffsetTime time ) LocalDateの年、月、日の情報に引数で指定したtimeの時、分、秒、ナノ秒の情報およびUTCからの時差の情報が設定されたOffsetDateTimeを生成するメソッド
LocalDateTime atTime(int hour, int minutes, int second, int nanoOfSecond) LocalDateの年、月、日の情報に引数で指定した時、分、秒、ナノ秒の情報が設定されたLocalDateTimeを生成するメソッド

Time(時刻を表すクラス)

 java.timeパッケージには時刻を表すクラスが用意されています。それらのクラスは時、分、秒、ナノ秒の情報を持っており、下記のクラスがあります。このクラスには日付の年、月、日の要素は待っていません。

クラス 概要
LocalTime タイムゾーンやUTCからの時差など情報を持たない時、分、秒、ナノ秒の時刻の情報を持つクラス
OffsetTime UTCからの時差を表すZoneOffsetの情報と時、分、秒、ナノ秒の時刻の情報を持つクラス

その他の日付や曜日を表すクラスおよび列挙型

 java.timeパッケージには年月や月日および年を表すクラス、および月や曜日を表す列挙型が用意されています。

クラス 概要
YearMonth 年と月を扱うクラス
MonthDay 月と日を扱うクラス
Year 年を扱うクラス
Month 月を扱う列挙型。用意されている要素は下記
・JANUARY:1月
・FEBRUARY:2月
・MARCH:3月
・APRIL:4月
・MAY:5月
・JUNE:6月
・JULY:7月
・AUGUST:8月
・SEPTEMBER:9月
・OCTOBER:10月
・NOVEMBER:11月
・DECEMBER:12月
DayOfWeek 曜日を表す列挙型。数値としての値は月曜日から1で始まる。用意されている要素は下記
・MONDAY:月曜日
・TUESDAY:火曜日
・WEDNESDAY:水曜日
・THURSDAY:木曜日
・FRIDAY:金曜日
・SATURDAY:土曜日
・SUNDAY:日曜日

 この中でYearMonthやMonthDayクラスからLocalDateを生成するメソッドを持っています。そして、YearクラスにはLocalDateおよびYearMonthを生成するメソッドが用意されています。

YearMonth
戻り値 メソッド 概要
LocalDate atDay( int dayOfMonth ) 呼び出し元のYearMonthの年月の値に引数で指定した対象年月の日であるdayOfMonthが設定されたLocalDateを生成するメソッド
LocalDate atEndOfMonth 呼び出し元のYearMonthの月末の日が設定されたLocalDateを生成するメソッド
MonthDay
戻り値 メソッド 概要
LocalDate atYear( int year ) 呼び出し元のMonthDayの月日の値に引数で指定したyearが年の値として設定されたLocalDateを生成するメソッド
Year
戻り値 メソッド 概要
LocalDate atMonthDay( MonthDay monthDay) 呼び出し元のYearの年の値に引数で指定したmonthDayの月日の値が設定されたLocalDateを返すメソッド
LocalDate atDay(int dayOfYear) 呼び出し元のYearの年に引数で指定したdayOfYearのその年の日数の年月日のLocalDateを返すメソッド。例えばYearが2014年の場合、引数に「1」を渡した場合は「2014-01-01」のLocalDateを生成し、引数に「32」を渡した場合は、2014年1月1日から32日目の「2014-02-01」のLocalDateを生成
YearMonth atMonth( Month month ) 呼び出し元のYearの年の値に、引数のMonthの月の値が設定されたYearMonthを生成するメソッド
YearMonth atMonth(int month) 呼び出し元のYearの年の値に、引数のMonthの月の値が設定されたYearMonthを生成するメソッド。この引数の月の値は「1」が1月を表す

 このようにYearMonth、MonthDay、YearクラスにはLocalDateを生成するメソッドが用意されています。しかし、各DateTimeクラスや各DateクラスからYearMonth、MonthDay、Yearを生成するメソッドは用意されていません。特に注意が必要なのはgetYearメソッドで、これはint値で結果を返します。

 また、月を表す列挙型のMonthを取得するメソッドが月の値を持つクラスに用意されていて、曜日を表すDayOfWeekを取得するメソッドは、曜日を算出するために必要な、年と月と日の値を持つクラスに用意されています。

Month/DayOWeekを返すメソッド
戻り値 メソッド 概要
Month getMonth() 呼び出し元が持つ月の情報から、該当するMonthの列挙型を返すメソッド
DayOfWeek getDayOfWeek() 呼び出し元が持つ曜日の情報から、該当するDayOfWeekの列挙型を返すメソッド

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。