Date and Time APIの基本的な扱い方

Javaで日時を扱うAPIがDate and Time APIです。これは、java.timeパッケージとして、提供されておりLocalDateクラス、LocalTimeクラス、LocalDateTimeクラスなどのクラスを持ちます。

本記事では、これらのクラスを用いて日時の操作方法について学びます。

【PR】プログラミングスクール【PR】独学で挫折しそう、やっぱり難しい、手早く学びたい。そんな人にはやはりプログラミングスクールがお勧めです。

【プログラミングスクールを利用するメリット】

JavaはWebアプリケーションなどを作ることができるプログラミング言語です。しかし、独学だと基本事項からなかなか抜け出せず、アプリを作るイメージができずに挫折してしまう人も多いです。紹介する二つのプログラミングスクールのJavaコースはWebアプリケーションを作ることを前提にカリキュラムが組まれていますので、より実用的な内容を学ぶことができます。

 

おすすめ1▶TechAcademy
Javaコース

おすすめ1▶CodeCamp
Javaマスターコース

Date and Time APIの超基本的なメソッド

Date and Time APIはJava SE8からの新機能として導入されたAPIです。

それ以前はDateクラス、Calenderクラスなどを用いて日付操作を行っていたそうですが、これらが不完全なクラスだったため、SE8の目玉機能の一つとして導入された経緯があります。
https://builder.japan.zdnet.com/sp_oracle/35067620/

Date and Time APIは日付操作に関する様々なパッケージの集合体です。パッケージはクラスの集合体ですので、多くのクラスの集合体とも言えます。多くのクラスの中でも最も基本的なクラスは次の3つでしょう。

1.LocalDateクラス・・・日付を取得するクラス
2.LocalTimeクラス・・・時間を取得するクラス
3.LocalDateTimeクラス・・・日付と時間を取得するクラス

各クラスにはメソッドが用意されていますが、扱い方は似ていますまず、現在時刻を取得してみましょう。




現在時刻を取得する

現在時刻を取得するには、now()メソッドを使用して、次のように記述します。

実行結果2019-12-08
13:38:28.592012800
2019-12-08T13:38:28.592012800

上から順に、日付、時間、日付+時間となっていると思います。ただし、日付ならともかく時間のほうはちょっと使いにくい値になっていると思います。もちろん、この値を変換して好きな表示方法にすることもできます。それについては後述します。

 

日時を指定して表示する

日付を指定して表示には、of()メソッドを使用します。試しに平成最終日時を取得してみます。

実行結果2019-04-30
23:59:59
2019-04-30T23:59:59

この場合、気を付けたいのは存在しない日付を指定すると実行時エラーになることです。4月31日は存在しないので、次のようにするとエラーとなります。

 

実行結果Exception in thread “main” java.time.DateTimeException: Invalid date ‘APRIL 31’
at java.base/java.time.LocalDate.create(LocalDate.java:459)
at java.base/java.time.LocalDate.of(LocalDate.java:271)
at test.test1.main(test1.java:8)

 

ここまでが、Date and Time APIを用いて日時を取得する超基本的な話です。次からは、String型で入力された日時をLocalDateTime型の値にするといったような、より実用的な扱い方を説明します



String型の値をLocalDateTime型にする

ここからもクラスはLocalDateクラス、LocalTimeクラス、LocalDateTimeクラスは似た扱いになりますので、並列して試していきます。

String型の値を変換するのはparse()メソッドになります。次のコードを見てください。

実行結果2019-04-30
23:59:59
2019-04-30T23:59:59

parse()メソッド内の値はString型の値ですが、LocalDateTime型の変数に代入されて出力できていることがわかります。ただし、この値のフォーマットは固定であり、このような書き方でないと変換ができません。試しに、よく使われるであろう「/」を用いた書式にするとエラーになります。

実行結果Exception in thread “main” java.time.format.DateTimeParseException: Text ‘2019/04/30’ could not be parsed at index 4
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDate.parse(LocalDate.java:428)
at java.base/java.time.LocalDate.parse(LocalDate.java:413)
at test.test1.main(test1.java:8)

そこで登場するのがjava.time.Formatterパッケージです。

Formatterクラスの使用

Formatterクラスを使用すると日時指定の幅がぐっと広がります。よく使いそうな二つの返還方法を見てみましょう。

String型⇒LocalDate型の変換

2019/4/30のような形式でLocalDateクラスに変換するのは次のように記述します。

実行結果2019-04-30
2019-04-30T23:59:59

まず、指定日付や指定日時はString型で指定します。次に、フォーマットをofPattern()メソッドで指定します。最後に、parse()メソッドで変換をします。

parse()メソッドですが、引数には(変換するString型変数,DateTimeFormatter型のフォーマット)というように指定します。String型変数がフォーマットにあっていないと実行時エラーになるので注意しましょう。

フォーマットは色々なパターンが考えられます。例えば、日本語で「2019年4月30日23時59分59秒」などを変換したいときはこのようにすればできます。

実行結果2019-04-30
23:59:59
2019-04-30T23:59:59

次に、LocalDate型などから「2019/04/30」などString値への変換を見てみましょう。

LocalDate型⇒String型への変換

LocalDate型などからString型への変換はformat()メソッドを使用して次のように記述します。ここでは現在時刻をフォーマットに合わせてみましょう。

実行結果2019/12/10
2019/12/10 00:12:16

以上がDate and Time APIの扱い方になります。この他にも日数の加算や減算などができるメソッドが用意されており、よりSE7以前に比べ、日時が扱いやすくなっています。