ImmutableでスレッドセーフになったJavaの新しい日時APIの基礎知識:ここが大変だよJava 8 Date-Time API(1)(3/5 ページ)
Date-Time APIの概要や、Java 8より前の旧日時APIから何が改善されたのかに加え、新しく追加されたさまざまなクラスについて解説します。
日付および時刻を表す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クラスに変換することが可能です。また、逆に自身の持つタイムゾーンや時差の情報を除くことにより、それらの情報を持たないクラスに変換することも可能です。
戻り値 | メソッド | 概要 |
---|---|---|
ZonedDateTime | atZone(ZoneId zoneId) | 呼び出したLocalDateTimeの情報に引数のZoneIdのタイムゾーンの情報が設定されたZonedDateTimeを生成するメソッド |
OffsetDateTime | atOffset(ZoneOffset offset) | 呼び出したLocalDateTimeの情報に引数のZoneOffsetの時差の情報が設定されたOffsetDateTimeを生成するメソッド |
戻り値 | メソッド | 概要 |
---|---|---|
LocalDateTime | toLocalDateTime() | 呼び出したZonedDateTimeの情報からZoneIdの情報をなくして年、月、日、時、分、秒、ナノ秒が設定されたLocalDateTimeを生成するメソッド |
OffsetDateTime | toOffsetDateTime() | 呼び出したZonedDateTimeの情報からZoneIdの情報をなくし、ZoneOffsetの情報が設定されたOffsetDateTimeを生成するメソッド |
戻り値 | メソッド | 概要 |
---|---|---|
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を生成するメソッドが用意されています。
戻り値 | メソッド | 概要 |
---|---|---|
LocalDate | atDay( int dayOfMonth ) | 呼び出し元のYearMonthの年月の値に引数で指定した対象年月の日であるdayOfMonthが設定されたLocalDateを生成するメソッド |
LocalDate | atEndOfMonth | 呼び出し元のYearMonthの月末の日が設定されたLocalDateを生成するメソッド |
戻り値 | メソッド | 概要 |
---|---|---|
LocalDate | atYear( int year ) | 呼び出し元のMonthDayの月日の値に引数で指定したyearが年の値として設定されたLocalDateを生成するメソッド |
戻り値 | メソッド | 概要 |
---|---|---|
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 | getMonth() | 呼び出し元が持つ月の情報から、該当するMonthの列挙型を返すメソッド |
DayOfWeek | getDayOfWeek() | 呼び出し元が持つ曜日の情報から、該当するDayOfWeekの列挙型を返すメソッド |
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 初心者のためのJavaラムダ式入門とJDKのインストール、IDEの環境構築
本連載では、今までJavaの経験はあっても「ラムダ式は、まだ知らない」という人を対象にラムダ式について解説していきます。初回は、ラムダ式の概要と利点、必要性、JDK 8のセットアップ、NetBeans、IntelliJ IDEA、Eclipseの環境構築について。 - ラムダ式、JAR脱獄、JavaScript/Node.jsに接近するJDK 8、そして9へ
- Java 8&Java EE 7に対応した「Spring Framework 4.0」正式版リリース
米Pivotalは2013年12月12日、オープンソースのJavaアプリケーションフレームワーク「Spring Framework 4.0」の正式版をリリースした。 - JDK 8、TLS 1.2がデフォルトに
Javaの通信暗号化もTSL 1.2に。基本的に後方互換性は維持するが、一部影響がある場合もあるという。