1.ZonedDateTimeクラス

Date Time API にはもう 1 つの非常に興味深いクラスがあります。それはZonedDateTimeclass です。その主な目的は、異なるタイムゾーンでの日付の操作を容易にすることです。

LocalDate日付を表すのに最適です。たとえば、誕生日。私の誕生日はどこにいても3月15日です。これは日付の一例です。

LocalTime目覚まし時計の設定時間のように、時間を説明するのに最適です。目覚ましを午前 5 時にセットしましたが、どこにいるかは関係ありません。午前5時は午前5時です。これは時間を扱う例です。

ここで、フライトを予約するアプリケーションを作成しているとします。飛行機は現地時間に基づいて離陸、到着します。飛行機は一定時間飛行しますが、タイムゾーンは変更される可能性があります。

時間帯

ところで、タイムゾーンは本当に混乱しています。タイムゾーンが 24 あると考えているなら、それは大きな間違いです。

たとえば、インドの時間はグリニッジ標準時と 5 時間半異なりますGMT+5:30。夏時間に切り替える国もあれば、切り替えない国もあります。さらに、国によっては、1 年の異なる時期にサマータイムに切り替わります。

また、一部の国では、夏時間を廃止したり、再導入したり、再度中止したりする法律を制定しています。

いずれにせよ、世界にはタイムゾーンがあり、各タイムゾーン内には 1 つの時間が存在します。異なるゾーンの時刻は、1 年の特定の期間では一致し、他の期間では異なる場合があります。タイム ゾーンは通常、そのタイム ゾーンにある主要都市にちなんで名付けられます: Europe/MonacoAsia/Singaporeただし例外もあります — US/Pacific

現在、公式には 599 のタイムゾーンがあります。考えてみてください: 599。24 には程遠いです。グローバルな世界へようこそ。

ZoneIdパッケージのクラスは、Javajava.timeでタイムゾーンを格納するために使用されます。

ちなみに、これには静的getAvailableZoneIds()メソッドがあり、現在知られているすべてのタイムゾーンのセットを返します。すべてのゾーンのリストを取得するには、次のコードを記述する必要があります。

コード コンソール出力(一部)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

ZoneIdオブジェクトを名前で取得するには、静的of()メソッドを使用する必要があります。

コード ノート
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2.ZonedDateTimeオブジェクトの作成

オブジェクトを作成するときはZonedDateTime、クラスの静的now()メソッドを呼び出してZoneIdオブジェクトを渡す必要があります。

コード コンソール出力
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

ZoneIdメソッドにオブジェクトを渡さない場合now()(それが許可されている場合)、タイムゾーンはプログラムを実行しているコンピュータの設定に基づいて自動的に決定されます。

例:

コード コンソール出力
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

グローバル日付をローカル日付に変換する

の興味深い機能の 1 つは、ZonedDateTimeローカルの日付と時刻に変換できることです。例:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. 時間の使い方

クラスと同様LocalDateTime、このZonedDateTimeクラスにも日付と時刻の個々の要素を取得する方法がたくさんあります。これらのメソッドのリストを次に示します。

int getYear()
特定の日付の年を返します
Month getMonth()
日付の月を返します: いくつかの定数の 1 つ —JANUARY, FEBRUARY, ...;
int getMonthValue()
日付の月のインデックスを返します。1月 == 1
int getDayOfMonth()
月の日のインデックスを返します
DayOfWeek getDayOfWeek()
曜日を返します: いくつかの定数の 1 つ —MONDAY, TUESDAY, ...;
int getDayOfYear()
その年の日付のインデックスを返します
int getHour()
時間を返します
int getMinute()
分を返します
int getSecond()
秒を返します
int getNano()
ナノ秒を返します

すべてのメソッドは、クラスのメソッドと完全に類似していますLocalDateTime。そしてもちろん、このZonedDateTimeクラスには日付と時刻を操作できるメソッドがあります。ただし、メソッドが呼び出されるオブジェクトは変わりません。代わりに、新しいZonedDateTimeオブジェクトを返します。

メソッド 説明
plusYears(int)
日付に年を加算します
plusMonths(int)
日付に月を加算します
plusDays(int)
日付に日数を加算します
plusHours(int)
時間を追加します
plusMinutes(int)
分を追加します
plusSeconds(int)
秒を追加します
plusNanos(int)
ナノ秒を追加します
minusYears(int)
日付から年を減算します
minusMonths(int)
日付から月を減算します
minusDays(int)
日付から日数を減算します
minusHours(int)
時間を減算します
minusMinutes(int)
分を減算します
minusSeconds(int)
秒を減算します
minusNanos(int)
ナノ秒を減算します

ここでのすべてのことは、今検討したクラスから類推して明らかだと思うので、例は示しません。