1. 概要
このクイックチュートリアルでは、Java 7、Java 8、およびJoda-Timeライブラリを使用して日付のタイムゾーンを設定する方法を説明します。
2. Java8の使用
Java 8は、主にJoda-Timeライブラリに基づいた日付と時刻を処理するための新しいDate-TimeAPIを導入しました。
Java DateTimeAPIのInstantクラスは、UTCのタイムライン上の単一の瞬間ポイントをモデル化します。 これは、1970UTCの最初の瞬間のエポックからのナノ秒のカウントを表します。
まず、システムクロックから現在の Instant を取得し、タイムゾーン名としてZoneIdを取得します。
Instant nowUtc = Instant.now();
ZoneId asiaSingapore = ZoneId.of("Asia/Singapore");
最後に、ZoneIdおよびInstantを使用して、タイムゾーンの詳細を含む日時オブジェクトを作成できます。 ZonedDateTime クラスは、ISO-8601カレンダーシステムのタイムゾーンで日時を表します。
ZonedDateTime nowAsiaSingapore = ZonedDateTime.ofInstant(nowUtc, asiaSingapore);
Java8のZonedDateTimeを使用して、タイムゾーンで日時を表しました。
3. Java7の使用
Java 7では、タイムゾーンの設定は少し注意が必要です。 Date クラス(特定の瞬間を表す)には、タイムゾーン情報は含まれていません。
まず、現在のUTC日付とTimeZoneオブジェクトを取得しましょう。
Date nowUtc = new Date();
TimeZone asiaSingapore = TimeZone.getTimeZone(timeZone);
Java 7では、 Calendar クラスを使用して、タイムゾーンで日付を表す必要があります。
最後に、 asiaSingaporeTimeZoneを使用してnowUtcCalendar を作成し、時刻を設定できます。
Calendar nowAsiaSingapore = Calendar.getInstance(asiaSingapore);
nowAsiaSingapore.setTime(nowUtc);
Java 7 date time APIを避け、Java 8 datetimeAPIまたはJoda-Timeライブラリを使用することをお勧めします。
4. Joda-Timeの使用
Java 8がオプションでない場合でも、Java8以前の世界での日時操作のデファクトスタンダードであるJoda-Timeから同じ種類の結果を得ることができます。
まず、Joda-Time依存関係をpom.xml:に追加する必要があります。
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>
タイムライン上の正確なポイントを表すために、org.joda.timeパッケージのInstantを使用できます。 内部的には、クラスは1つのデータを保持します。これは、1970-01-01T00:00:00ZのJavaエポックからのミリ秒単位の瞬間です。
Instant nowUtc = Instant.now();
DateTimeZone を使用して、タイムゾーン(指定されたタイムゾーンID)を表します。
DateTimeZone asiaSingapore = DateTimeZone.forID("Asia/Singapore");
これで、 nowUtc 時刻は、タイムゾーン情報を使用してDateTimeオブジェクトに変換されます。
DateTime nowAsiaSingapore = nowUtc.toDateTime(asiaSingapore);
これは、Joda-timeAPIを使用して日付とタイムゾーンの情報を組み合わせる方法です。
5. 結論
この記事では、Java 7、8、およびJoda-TimeAPIを使用してJavaでタイムゾーンを設定する方法を説明しました。 Java 8の日時サポートの詳細については、Java8日時イントロをご覧ください。
いつものように、コードスニペットはGitHubリポジトリで入手できます。