日付API
Java 8 には、java.time パッケージにまったく新しい日付と時刻の API が含まれています。新しい Date API は
Joda-Timeライブラリに相当しますが、同じではありません。次の例では、新しい API の最も重要な部分を説明します。
時計
時計を使用すると、現在の日付と時刻にアクセスできます。クロックはタイム ゾーンを認識するため、
System.currentTimeMillis()の代わりに使用して、現在時刻をミリ秒単位で返すことができます。この種の時間精度は、
Instantクラスでも表されます。
インスタントを使用して、継承された
java.util.Dateオブジェクトを作成できます。
Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
時間帯
タイムゾーンは、抽象クラス
ZoneIdによって表されます。これらは、統計ファクトリー手法を使用して簡単にアクセスできます。タイムゾーンは、瞬間的な日付と時刻とローカルの日付と時刻の間の変換に重要なオフセットを定義します。
System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]
現地時間
LocalTime は、タイムゾーンなしの時刻を表示します (例: 17:30:15)。次の例では、上で定義したタイム ゾーンの 2 つの現地時間オブジェクトを作成します。次に、2 つのオブジェクトを比較し、それらの間の時間と分の差を計算します。
LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239
LocalTime には、文字列解析など、インスタンス化を容易にするさまざまなファクトリ メソッドが付属しています。
LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); System.out.println(leetTime); // 13:37
ローカル日付
LocalDate には、2014-03-11 などの特定の日付が表示されます。インスタンスは不変であり、LocalTime と同様に動作します。この例では、日、月、年を加算または減算して新しい日付を計算する方法を示します。オブジェクトに対するすべての操作が新しいオブジェクトを返すことに注意してください。
LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY
文字列から LocalDate を解析することは、LocalTime を解析するのと同じくらい簡単です。
DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); System.out.println(xmas); // 2014-12-24
ローカル日時
LocalDateTime は日時を表示します。これは、上記の日付と時刻を 1 つのコピーに組み合わせたものです。LocalDateTime インスタンスは不変であり、LocalTime および LocalDate と同様に機能します。メソッドを使用して、必要なインスタンスのプロパティ値を取得できます。
LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439
追加のタイムゾーン情報とともに、インスタンスをインスタントに変換できます。インスタントは、java.util.Date を継承する古い型に簡単に変換できます。
Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014
日付/時刻の書式設定は、日付または時刻の書式設定と同じように機能します。事前定義された日付形式を使用する代わりに、手動で定義した形式を使用できます。
DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13
java.text.NumberFormat とは異なり、新しい DateTimeFormatter は不変であり、スレッド セーフです。フォーマットを記述するための構文の詳細については、
ここを参照してください。
注釈
Java 8 のアノテーションは反復可能です。これがどのように機能するかを示す例を見てみましょう。まず、有効なアノテーションの配列を格納するアノテーション ラッパーを定義します。Java
@interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); }
8 では、アノテーション @Repeatable を宣言することで、同じタイプの複数のアノテーションを使用できます。オプション 1: コンテナー アノテーションの使用 (オールドスクール) (Java 8 では、
@Repeatableアノテーション を宣言することで、同じタイプの複数のアノテーションを使用できます。) オプション 1: アノテーション コンテナーの使用 (オールドスクール)
@Hints({@Hint("hint1"), @Hint("hint2")}) class Person {}
オプション 2: 反復可能なアノテーションの使用 (新機能)
@Hint("hint1") @Hint("hint2") class Person {}
オプション 2 を使用すると、Java コンパイラは暗黙的に @Hint アノテーションを設定します。これは、リフレクションを通じて注釈情報を読み取るために重要です。
Personクラスの
@Hints
Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2
アノテーションは 宣言していませんが、
getAnnotation(Hints.class)メソッドを使用して読み取ることができます。ただし、より便利なメソッドは
getAnnotationsByTypeで、
@Hintアノテーション を使用してすべてのアノテーションへのアクセスを提供します。さらに、Java 8 でのアノテーションの使用は、次の 2 つの目的に拡張されます。
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}
これですべてです
Java 8 プログラミング チュートリアルが完了しました。JDK 8 のすべての新しいクラスと API 機能について詳しく知りたい場合は、次の記事を読んでください。
これは、 Arrays.ParallelSort、
StampedLock、
CompletableFutureなど、JDK 8 のすべての新しいクラスと隠し機能を理解するのに役立ちます。
GO TO FULL VERSION