java 8 で日付と時刻を扱う
java 8 で日付と時刻を扱う
java 8 で日付と時刻を扱う
java 8 では日付や時刻を扱うクラスとして新たにjava.timeパッケージが追加されました。その中でも日付を扱うLocalDateクラス、時刻を扱うLocalTimeクラス、日付と時刻の両方を扱うLocalDateTimeクラスの使い方を忘備録代わりにメモ。
そこ、「いまさらwwwww」とか言わないお約束。
動作環境について
実行環境は以下の通り。
PC:MacBook Pro 2011early 15inch
OS:Windows 8.1(デュアルブート) 64bit版
メモリ:16GB(8GB x 2)
CPU:Core i7-2635QM 2.00GHz
javaのバージョン:java 8 Update102
java.timeパッケージ
java.timeパッケージ
日付や時刻を扱うクラスとしてはすでにjava.util.Calendarクラスなどのクラスがあります。じゃあそっちを使えばいいじゃないとか言わない。
しかし、それらのクラスには特有の使いづらさがありました。1月は0、2月は1、3月は2、・・・ず、ずれてるぜ。
そこで新たにjava 8 で追加されたのがjava.timeパッケージです。
LocalDate、LocalTime、LocalDateTimeクラス
「LocalDateクラス」「LocalTimeクラス」「LocalDateTimeクラス」の3つのクラスは、このjava.timeパッケージに属するクラスです。
java.util.Calendarクラスよりも扱いやすいクラスです。ソースは私
各クラスの説明は以下の通りです。
なお、CharSequenceインタフェースが指定されている個所ではString型を使用しています。(String型はCharSequenceインタフェースを実装しているため。)
CharSequenceと言われたら文字列になりそうなものと思っておけばOKというとさすがに乱暴すぎるか(^^
LocalDateクラス
LocalDateクラスは「日付」を扱うクラスです。インスタンスを獲得するための代表的なメソッドは次の通り。いずれも戻り値はLocalDate型になります。
newによるインスタンス化はできないので注意。また、時刻を扱うことはできないので注意。
LocalDateクラスのメソッド(抜粋)
メソッド | 使用例
×がついているものはダメな例 |
説明 |
---|---|---|
static LocalDate now() | LocalDate.now() | メソッドが実行された日付を保持したインスタンスを返す。 |
× now() | staticメソッドなので、クラス名.now()で使用する必要がある。 | |
static LocalDate of(int year, int month, int dayOfMonth)
static LocalDate of(int year, Month month, int dayOfMonth) |
LocalDate.of(2017, 01, 01)
LocalDate.of(2017, Month.JANUARY, 1) |
引数で指定した数値をもとに、日付を保持したLocalDateクラスのインスタンスを返す。
第1引数にはint型で年を、第2引数にはint型かMonth型で月を、第3引数にはint型で日を指定する。Month型はjava.timeパッケージ内に定義されたEnumである。 |
× LocalDate.of(2017, 01, 01, 12, 30) | コンパイルエラー。LocalDateクラスなので時刻は指定できない。 | |
× LocalDate.of(2017, JANUARY, 1) | コンパイルエラー。第2引数はEnumのMonth型なので、Month.JANUARYと指定しないといけない。 | |
static LocalDate parse(CharSequence text) | LocalDate.parse(“2017-01-01”) | 引数で指定した文字列をもとに、日付を保持したLocalDateクラスのインスタンスを返す。
第1引数に文字列で日付を指定する。年4桁-月2桁-日付2桁の書式に合わせる必要がある。 日付を1桁にしないように注意。 |
× LocalDate.parse(“2017/01/01”) | 実行時エラー。2017/01/01ではスラッシュ区切りになってしまい、書式が合わない。 | |
× LocalDate.parse(“2017-01-01T12:30”) | 実行時エラー。書式はあっているが、時刻が入ってしまっている。 | |
static LocalDate parse(CharSequence text, DateTimeFormatter formatter) | LocalDate.parse(“20170101”,
DateTimeFormatter.BASIC_ISO_DATE) |
引数で指定した文字列をもとに、日付を保持したLocalDateクラスのインスタンスを返す。
第1引数では文字列で日付を指定し、第2引数ではその文字列の書式を指定する。BASIC_ISO_DATEの場合、年4桁月2桁日2桁で指定する。 |
LocalDate.parse(“2017/01/01”, DateTimeFormatter.ofPattern(“yyyy/MM/dd”)) | 引数で指定した文字列をもとに、日付を保持したLocalDateクラスのインスタンスを返す。
第1引数では文字列で日付を指定し、第2引数ではその文字列の書式を指定する。日付の書式に”2017/01/01″といったDateTimeFormatter型に定義されていない書式を利用する場合は、DateTimeFormatter.ofPatternメソッドで第2引数に適切な書式を設定する必要がある。 |
|
× LocalDate.parse(“2017/01/01”, DateTimeFormatter.ofPattern(“YYYY/MM/DD”)) | 実行時エラー。書式があっていない(大文字と小文字で意味が異なる)。
書式を自分で設定する際には注意が必要。 |
|
newによるインスタンス化 | × new LocalDate(2017, 1, 1)
× new LocalDate(“2017-01-01”) |
コンパイルエラー。newによるインスタンス化はできない。 |
その他 | × LocalDate.of(20170101)
× LocalDate.parse(“2017″,”01″,”01”) |
コンパイルエラー。引数の型や数が合っていない。 |
× LocalDate.of(2017, 13, 0)
× LocalDate.parse(“2017-13-0”) |
実行時エラー。存在しない日付(0月や13月、32日など)を指定している。
引数の型と数があっているためコンパイルは可能だが、実行すると実行時エラーとなる。 |
LocalTimeクラス
LocalTimeクラスは「時刻」を扱うクラスです。インスタンスを獲得するための代表的なメソッドは次の通り。いずれも戻り値はLocalTime型になります。
newによるインスタンス化はできないので注意。また、日付を扱うことはできないので注意。
LocalTimeクラスのメソッド(抜粋)
メソッド | 使用例
×がついているものはダメな例 |
説明 |
---|---|---|
static LocalTime now() | LocalTime.now() | メソッドが実行された時刻を保持したインスタンスを返す。 |
× now() | staticメソッドなので、クラス名.now()で使用する必要がある。 | |
static LocalTime of(int hour, int minute)
static LocalTime of(int hour, int minute, int second)
static LocalTime of(int hour, int minute, int second, int nanoOfSecond) |
LocalTime.of(12, 30)
LocalTime.of(12, 30, 45) LocalTime.of(12, 30, 45, 678) |
引数で指定した数値をもとに、時刻を保持したLocalTimeクラスのインスタンスを返す。
第1引数にはint型で時を、第2引数にはint型で分を指定する。 また、第3引数にint型で秒を、第4引数にint型でナノ秒を指定することもできる。 |
× LocalTime.of(2017, 01, 01, 12, 30)
× LocalTime.of(2017, 01, 01, 12, 30, 45) × LocalTime.of(2017, 01, 01, 12, 30, 678) |
コンパイルエラー。LocalTimeクラスなので日付は指定できない。 | |
static LocalTime parse(CharSequence text) | LocalTime.parse(“12:30”)
LocalTime.parse(“12:30:45”) LocalTime.parse(“12:30:45.678”) |
引数で指定した文字列をもとに、時刻を保持したLocalTimeクラスのインスタンスを返す。
第1引数に文字列で時刻を指定する。「時間2桁:分2桁」「時間2桁:分2桁:秒2桁」「時間2桁:分2桁:秒2桁.ナノ秒1~9桁」のいずれかの書式に合わせる必要がある。 |
× LocalTime.parse(“12:30:45:678”) | 実行時エラー。秒とナノ秒は:ではなく.で区切る。 | |
× LocalTime.parse(“2017-01-01T12:30”) | 実行時エラー。書式はあっているが、時刻が入ってしまっている。 | |
static LocalTime parse(CharSequence text, DateTimeFormatter formatter) | LocalTime.parse(“12:30:45+01:00”, DateTimeFormatter.ISO_TIME) | 引数で指定した文字列をもとに、時刻を保持したLocalTimeクラスのインスタンスを返す。
第1引数には文字列で時刻を指定し、第2引数ではその文字列の書式を指定する。ISO_TIMEの場合、時間2桁:分2桁:秒2桁+時差で指定する。 ※ISO_TIMEの場合は時差は書かなくても良い。 |
LocalTime.parse(“123045”, DateTimeFormatter.ofPattern(“HHmmss”) | 引数で指定した文字列をもとに、時刻を保持したLocalTimeクラスのインスタンスを返す。
第1引数には文字列で時刻を指定し、第2引数にはその文字列の書式を指定する。時刻の書式にを123045″といったDateTimeFormatter型に定義されていない書式を利用する場合は、DateTimeFormatter.ofPatternメソッドで第2引数に適切な書式を設定する必要がある。 |
|
× LocalTime.parse(“123045”, DateTimeFormatter.ofPattern(“hhmmss”) | 実行時エラー。書式があっていない(大文字と小文字で意味が異なる)。
書式を自分で設定する際には注意が必要。 |
|
newによるインスタンス化 | × new LocalTime(12, 30, 45)
× new LocalTime(“12:30:45”) |
コンパイルエラー。newによるインスタンス化はできない。 |
その他 | × LocalTime.of(123045)
× LocalTime.parse(“12″,”30″,”45”) |
コンパイルエラー。引数の型や数が合っていない。 |
× LocalTime.of(24, 30, 15)
× LocalTime.parse(“25:30:90”) |
実行時エラー。存在しない時刻を指定している。24時という表現はできないので注意。
引数の型と数があっているためコンパイルは可能だが、実行すると実行時エラーとなる。 |
LocalDateTimeクラス
LocalDateTimeクラスは「日付」と「時刻」の両方を扱うクラスです。インスタンスを獲得するための代表的なメソッドは次の通り。いずれも戻り値はLocalDateTime型になります。
newによるインスタンス化はできないので注意。
LocalDateTimeクラスのメソッド(抜粋)
メソッド | 使用例
×がついているものはダメな例 |
説明 |
---|---|---|
static LocalDateTime now() | LocalDateTime.now() | メソッドが実行された日付と時刻を保持したインスタンスを返す。 |
× now() | staticメソッドなので、クラス名.now()で使用する必要がある。 | |
static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute)
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute)
static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second)
static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) |
LocalDateTime.of(2017, 1, 1, 12, 30)
LocalDateTime.of(2017, Month.JANUARY, 1, 12, 30) LocalDateTime.of(2017, 1, 1, 12, 30, 45) LocalDateTime.of(2017, 1, Month.JANUARY, 12, 30, 45) LocalDateTime.of(2017, 1, 1, 12, 30, 45, 678) LocalDateTime.of(2017, Month.JANUARY, 1, 12, 30, 45, 678) |
引数で指定した数値をもとに、日付と時刻を保持したLocalDateTimeクラスのインスタンスを返す。
第1引数にはint型で年を、第2引数にはint型かMonth型で月を、第3引数にはint型で日付を、第4引数にはint型で時を、第5引数にはint型で分を指定する。 また、第6引数にint型で秒を、第7引数にint型でナノ秒を指定することもできる。 Month型はjava.timeパッケージ内に定義されたEnumである。 |
× LocalDateTime.of(2017, 01, 01)
× LocalDateTime.of(12, 30, 45) |
コンパイルエラー。LocalDateTimeクラスのof()メソッドをint型/Month型を引数にして利用するためには最低でも年、月、日と時間、分を指定しなければいけない。 | |
static LocalDateTime of(LocalDate date, LocalTime time) | LocalDateTime.of(LocalDate.now(), LocalTime.now())
LocalDateTime.of(LocalDate.of(2017, 1, 1), LocalTime.of(12, 30, 45)) |
LocalDateTimeクラスのof()メソッドには、引数にLocalDate型の変数とLocalTime型の変数を取るものもある。
この場合、引数のLocalDate型の変数の表す日付と、LocalTime型の変数の表す時刻をもとに日付と時刻を保持したLocalDateTime型のインスタンスが返される。 |
× LocalDateTime.of(LocalDate.now(), 24, 30, 15)
× LocalDateTime.of(2017, 1, 1, LocalTime.now()) |
コンパイルエラー。LocalDate/LocalTimeのどちらか片方と数字を組み合わせてLocalDateTimeクラスのof()メソッドを使用することはできない。 | |
static LocalDateTime parse(CharSequence text) | LocalDateTime.parse(“2017-01-01T12:30”)
LocalDateTime.parse(“2017-01-01T12:30:45”) LocalDateTime.parse(“2017-01-01T12:30:45.678”) |
引数で指定した文字列をもとに、時刻を保持したLocalDateTimeクラスのインスタンスを返す。
第1引数に文字列で時刻を指定する。「年2桁-月2桁-日付2桁」の後にTをはさんで「時間2桁:分2桁」「時間2桁:分2桁:秒2桁」「時間2桁:分2桁:秒2桁.ナノ秒1~9桁」のいずれかを記述する。 書式にあっていないと実行時エラーになる。特に、日付を1桁にしないように注意。 |
× LocalDateTime.parse(“2017-01-01 12:30:45:678”) | 実行時エラー。日付と時刻は半角スペースではなくTで区切る。 | |
× LocalDateTime.parse(“2017/01/01T12:30”) | 実行時エラー。parse()メソッドで書式を指定しない場合、日付は/ではなく-で区切る。 | |
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) | LocalDateTime.parse(“2017-01-01T12:30:45+00:00”, DateTimeFormatter.ISO_OFFSET_DATE_TIME) | 引数で指定した文字列をもとに、時刻を保持したLocalDateTimeクラスのインスタンスを返す。
第1引数には文字列で時刻を指定し、第2引数ではその文字列の書式を指定する。ISO_OFFSET_DATE_TIMEの場合、時間2桁:分2桁:秒2桁+(タイムゾーンの時間差)で指定する。 ※ISO_OFFSET_DATE_TIMEの場合、時差を書かないと実行時エラー |
LocalDateTime.parse(“2017-01-01 12:30:45.678”, DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss.SSS”))
LocalDateTime.parse(“2017-01-01T12:30:45.678”, DateTimeFormatter.ofPattern(“yyyy-MM-dd’T’HH:mm:ss.SSS”)) |
引数で指定した文字列をもとに、時刻を保持したLocalDateTimeクラスのインスタンスを返す。
第1引数には文字列で時刻を指定し、第2引数にはその文字列の書式を指定する。日付をスラッシュ区切りにしたり、日付と時刻の間を半角スペースで開けたりといったDateTimeFormatter型に定義されていない書式を利用する場合は、DateTimeFormatter.ofPatternメソッドで第2引数に適切な書式を設定する必要がある。 また、DateTimeFormatter.ofPattern()メソッドの引数でアルファベットをただの文字として利用したい場合、シングルコーテーションで括る必要がある。 |
|
× LocalDateTime.parse(“2017-01-01 12:30:45.678”, DateTimeFormatter.ofPattern(“YYYY-mm-dd HH:MM:ss.SSS”)) | 実行時エラー。書式があっていない(大文字と小文字で意味が異なる)。
例では、月を表すMMと時間を表すmmが逆になっているため、月を30月と解釈して実行時エラーとなる。 書式を自分で設定する際には注意が必要。 |
|
newによるインスタンス化 | × new LocalDateTime(2017, 1, 1, 12, 30)
× new LocalDateTime(“2017-01-01T12:30”) |
コンパイルエラー。newによるインスタンス化はできない。 |
その他 | × LocalDateTime.of(20170101)
× LocalDateTime.parse(“2017″,”1″,”1”, “12”, “30”) |
コンパイルエラー。引数の型や数が合っていない。 |
× LocalDateTime.of(2017, 2, 31, 24, 30, 15)
× LocalDateTime.parse(“2017-1-10T12:0:45”) |
実行時エラー。存在しない時刻を指定している。24時という表現はできないので注意。
引数の型と数があっているためコンパイルは可能だが、月や分が1桁で書式があっていない。実行すると実行時エラーとなる。 |
な、長かったぜ