Date and Time APIについて調べてみた その1
【前提条件】
[参考資料]
Java8 APIドキュメント
http://docs.oracle.com/javase/jp/8/api/
JJUG 祝Java8Launch のスライド
Brand new Date and Time API(@khasunumaさん)
http://www.slideshare.net/btnrouge/jdk8-threeten
【日付情報に関するクラス】
日付情報で基本となるクラスは下記の3つです。
LocalDateは日付、LocalTimeは時刻、
LocalDateTimeは日付と時刻を保持するクラスです。
上記のクラスはタイムゾーンの情報を持たないため、
タイムゾーンを意識する場合は下記のクラスを使います。
上記の2つのクラスとLocalDateTimeクラスとで
基本的なメソッドに関しては使い方は変わらないです。
【現在時刻の取得】
現在時刻の取得は各クラスのnowメソッドを使います。
nowメソッドはいくつかのメソッドシグネチャを持ちます。
[サンプルコード1]
まずはパラメータなしのパターンです。
public static void sampleNow01() { System.out.println(LocalDate.now()); System.out.println(LocalTime.now()); System.out.println(LocalDateTime.now()); }
パラメータなしの場合は
システムのデフォルトタイムゾーンの現在時刻が設定された
オブジェクトを生成します。
生成されたオブジェクト自体にはタイムゾーンの情報は持ちません。
[実行結果1]
2014-06-07 15:45:30.944 2014-06-07T15:45:30.944
今日の時刻を元に結果が出力されていることがわかります。
(エントリを登録する前に実行していることもわかってしまいますね)
LocalDateTimeの出力形式はISO8601の時刻表記で、
日付と時刻が「T」でつなげられています。
[サンプルコード2]
つづいてパラメータを指定するパターンです。
public static void sampleNow02() { System.out.println(LocalDateTime.now(Clock.systemUTC())); System.out.println(LocalDateTime.now(Clock.systemDefaultZone())); System.out.println(LocalDateTime.now(ZoneId.of("Asia/Tokyo"))); System.out.println(LocalDateTime.now(ZoneId.of("America/Los_Angeles"))); }
前半の2つはjava.time.Clockクラスのオブジェクトを指定するパターンです。
サンプルではUTCとデフォルトのタイムゾーンを指定しています。
後半の2つはjava.time.ZoneIdクラスのオブジェクトを指定するパターンです。
サンプルでは東京とロサンゼルスのタイムゾーンを指定しています。
【特定時刻の取得】
特定時刻の取得は各クラスのofメソッドを使用します。
[サンプルコード]
public static void sampleOf() { final LocalDate date1 = LocalDate.of(2014, 5, 10); final LocalDate date2 = LocalDate.of(2012, Month.JULY, 24); System.out.println(date1); System.out.println(date2); final LocalTime time1 = LocalTime.of(22, 30, 12, 123); final LocalTime time2 = LocalTime.of(13, 11); System.out.println(time1); System.out.println(time2); final LocalDateTime dateTime1 = LocalDateTime.of(1986, 12, 16, 11, 45, 52, 123_456_789); final LocalDateTime dateTime2 = LocalDateTime.of(date1, time1); final LocalDateTime dateTime3 = LocalDateTime.of(date2, time2); System.out.println(dateTime1); System.out.println(dateTime2); System.out.println(dateTime3); }
LocalDate#ofメソッドの場合は年・月・日を指定します。
月にはintかjava.time.Monthオブジェクトを指定します。
intの指定は1〜12で指定します。
LocalTime#ofメソッドの場合は時・分・秒・ナノ秒を指定します。
時・分に関しては必ず指定する必要がありますが、
秒・ナノ秒に関しては省略することが出来ます。
LocalDateTime#ofメソッドの場合は年〜ナノ秒までを指定するか、
LocalDateオブジェクトとLocalTimeオブジェクトを指定します。
[実行結果]
2014-05-10 2012-07-24 22:30:12.000000123 13:11 1986-12-16T11:45:52.123456789 2014-05-10T22:30:12.000000123 2012-07-24T13:11
それぞれ指定された値が出力されているのがわかります。
出力フォーマットを指定していない場合、
時刻の指定で省略されたパラメータ部分は出力されないようです。