Java は ついに、日付と時刻を操作する直観的で信頼性の高い方法を手に入れました。日付と時刻の原則は、多くのアプリケーションの基本です。誕生日、レンタル日、イベント時間、店舗の営業時間などのさまざまな情報はすべて日付と時刻に基づいていますが、Java SE ではそれらを操作する便利な方法が提供されていませんでした。Java SE 8以降、日付と時刻を操作するための適切に構造化されたAPIを提供するjava.timeパッケージのセットがありました。
以下に、その実装における既存の問題の小さなリストを示します。
背景
Java が初めて登場したバージョン1.0 では、日付と時刻を操作する唯一のクラスはjava.util.Dateでした。開発者が最初に気づいたのは、これが「日付」を表していないということでした。実際、これは 1970 年 1 月 1 日から測定されたミリ秒単位の精度で、ある時点を表します。しかし、一部の開発者は、 DateのtoString()メソッドがマシンのJava設定で指定されたタイム ゾーンで日付と時刻を表示するという事実に基づいて、Date がタイム ゾーンで動作できると誤って結論付けました。このクラスを修正するのは非常に困難 (または非常に怠惰) であることが判明したため、バージョン1.1では新しいクラスjava.util.Calendarを追加する必要がありました。残念ながら、CalendarクラスはDateよりもそれほど優れているわけではないことが判明しました。- 変更可能。日付や時刻などのクラスは不変である必要があります。
- オフセット。Date の年は 1900 年から始まり、両方のクラスの月は 0 から始まります。
- 名前。Date は実際には「日付」ではなく、Calendar はカレンダーではありません。
- フォーマット中。書式設定はカレンダーではなく日付でのみ機能し、スレッドセーフではありません。
レビュー
新しい java.time API には 5 つのパッケージが含まれています。- java.time - 値を保存するオブジェクトを含む基本パッケージ
- java.time.chrono - さまざまなカレンダーへのアクセスを提供します
- java.time.format - 日付と時刻のフォーマットと認識
- java.time.temporal - 低レベルのライブラリと高度な機能
- java.time.zone - タイムゾーンを操作するためのクラス
日付
LocalDate クラスは、新しい APIで最も重要なクラスの 1 つです。日付を表す不変の値が含まれます。時刻やタイムゾーンの設定はできません。「ローカル」という名前は Joda-Timeでよく知られているかもしれませんが、もともとは ISO-8601標準に由来しています。それは正確にはタイムゾーンがないことを意味します。基本的に、 LocalDate は「2014 年 4 月 5 日」などの日付の説明です。この日付の実際の時刻は、タイムゾーンによって異なります。たとえば、オーストラリアでは、この日付はロンドンより 10 時間早く、サンフランシスコより 18 時間早くなります。 LocalDateクラスには、一般的に必要なメソッドがすべて含まれています。LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
この例では、ファクトリ メソッドを使用して作成された日付が表示されます (すべてのコンストラクターはプライベートです)。次に、オブジェクトにデータを要求します。
Monthおよび
DayOfWeek列挙は、コードをより読みやすく信頼性を高めるために設計されていることに注意してください。次の例では、日付を変更する方法を示します。クラスは不変であるため、結果は新しいオブジェクトになりますが、元のオブジェクトはそのまま残ります。
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
これらは比較的単純な変更ですが、多くの場合、より複雑な日付の変更が必要になります。
java.time APIには、これを行うための特別なメカニズムである TemporalAdjuster があります。その目的は、月の最終日に対応するオブジェクトを取得するなど、日付を操作できる組み込みツールを提供することです。それらの一部は
APIに含まれていますが、独自のものを追加することもできます。修飾子の使用は非常に簡単ですが、静的インポートが必要です。
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
修飾子を使用すると、コードが大幅に簡素化されます。手動による日付操作が大量に行われることを誰も望んでいません。プロジェクト内で何らかの日付操作が何度も発生する場合は、独自の修飾子を作成すると、チームはそれをすでに作成されテストされたコンポーネントとして使用できます。
GO TO FULL VERSION