Java 8 日時 API
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 です:
新しい 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);
LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
System.out.println("date3: " + date3);
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 の新機能
その他の拡張