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リポジトリで入手できます。