Java 8 日時 API

Java 8 新特性Java 8 の新機能


Java 8 は、新しい Date-Time API (JSR 310) のリリースにより、日時の処理をさらに強化しました。

旧版の Java では、日時 API には多くの問題が存在していました。その中には、次のものがあります:

  • スレッドセーフではない− java.util.Date はスレッドセーフではなく、すべての日付クラスは可変です。これは Java の日付クラス最大の問題の一つです。

  • 設計が悪い− Java の日付/時間クラスの定義は一貫しておらず、java.util と java.sql のパッケージの両方に日付クラスがあります。さらに、フォーマットと解析のためのクラスは java.text パッケージで定義されています。java.util.Date は日付と時刻の両方を含みますが、java.sql.Date は日付のみを含み、それを java.sql パッケージに含めるのは不合理です。また、この2つのクラスは同じ名前を持っており、これ自体が非常にお粗末な設計です。

  • タイムゾーンの処理が面倒− 日付クラスは国際化を提供しておらず、タイムゾーンをサポートしていません。そのため、Java は java.util.Calendar と java.util.TimeZone クラスを導入しましたが、それらにも上記のすべての問題が存在します。

Java 8 はjava.timeパッケージ内で多くの新しい API を提供しています。以下は、重要な2つの API です:

  • Local(ローカル)− 日時の処理を簡素化し、タイムゾーンの問題がありません。

  • Zoned(タイムゾーン)− 指定されたタイムゾーンで日時を処理します。

新しい java.time パッケージは、日付、時刻、日時、タイムゾーン、瞬間(instants)、過程(during)、クロック(clock)を処理するすべての操作をカバーしています。


ローカル日時 API

LocalDate/LocalTime および LocalDateTime クラスは、タイムゾーンの処理が必須でない場合に使用できます。コードは次のとおりです:

Java8Tester.java ファイル

import java.time.LocalDate; import java.time.LocalTime; import java.time.LocalDateTime; import java.time.Month; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testLocalDateTime(); } public void testLocalDateTime(){ //現在の日時を取得する LocalDateTime currentTime = LocalDateTime.now(); System.out.println("現在時刻:" + currentTime); LocalDate date1 = currentTime.toLocalDate(); System.out.println("date1: " + date1); Month month = currentTime.getMonth(); int day = currentTime.getDayOfMonth(); int seconds = currentTime.getSecond(); System.out.println("月:" + month +", 日:" + day +", 秒:" + seconds); LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012); System.out.println("date2: " + date2); // 12 december 2014 LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12); System.out.println("date3: " + date3); //22 時間 15 分 LocalTime date4 = LocalTime.of(22, 15); System.out.println("date4: " + date4); //文字列を解析 LocalTime date5 = LocalTime.parse("20:15:30"); System.out.println("date5: " + date5); } }

上記のスクリプトを実行すると、出力結果は次のとおりです:

$ javac Java8Tester.java 
$ java Java8Tester
当前时间: 2016-04-15T16:55:48.668
date1: 2016-04-15
月: APRIL, 日: 15, 秒: 48
date2: 2012-04-10T16:55:48.668
date3: 2014-12-12
date4: 22:15
date5: 20:15:30

タイムゾーンを使用する日時 API

タイムゾーンを考慮する必要がある場合は、タイムゾーンを使用する日時 API を使用できます:

Java8Tester.java ファイル

import java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester { public static void main(String args[]){ Java8Tester java8tester = new Java8Tester(); java8tester.testZonedDateTime(); } public void testZonedDateTime(){ //現在の日時を取得する ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]"); System.out.println("date1: " + date1); ZoneId id = ZoneId.of("Europe/Paris"); System.out.println("ZoneId: " + id); ZoneId currentZone = ZoneId.systemDefault(); System.out.println("現在のタイムゾーン:" + currentZone); } }

上記のスクリプトを実行すると、出力結果は次のとおりです:

$ javac Java8Tester.java 
$ java Java8Tester
date1: 2015-12-03T10:15:30+08:00[Asia/Shanghai]
ZoneId: Europe/Paris
当期时区: Asia/Shanghai

Java 8 新特性Java 8 の新機能

その他の拡張