カテゴリ: Javaの例外処理 更新日: 2026/05/11

JavaのZonedDateTimeでタイムゾーン付きの日付・時刻を正確に扱う方法

367
Java のタイムゾーンを考慮した日付の扱い方(ZonedDateTime)

先生と生徒の会話形式で理解しよう

生徒

「Javaで国ごとの時間を扱いたいんですが、タイムゾーンってどうやって指定するんですか?」

先生

「タイムゾーンを扱うにはZonedDateTimeというクラスを使うのが便利ですよ。世界各地のタイムゾーンに対応しています。」

生徒

「それって、普通のLocalDateTimeとは何が違うんですか?」

先生

「とても良いところに気づきましたね。LocalDateTimeはタイムゾーンを持たないのに対して、ZonedDateTimeはタイムゾーン情報を含む日付・時刻なんです。」

1. JavaのZonedDateTimeとは?

1. JavaのZonedDateTimeとは?
1. JavaのZonedDateTimeとは?

ZonedDateTimeは、Javaのjava.timeパッケージに属するクラスで、「日付・時刻・タイムゾーン」の3つをすべて含む強力なクラスです。これを使うことで、UTCやJST(日本標準時)、PST(アメリカ西海岸時間)などのタイムゾーンに対応した時刻の取得や表示が可能になります。

Javaで世界中のユーザーに対応するアプリケーションを作る場合、タイムゾーンを意識した設計が重要です。ZonedDateTimeは、タイムゾーンを考慮した処理を行いたいときの定番クラスです。

2. ZonedDateTimeの基本的な使い方

2. ZonedDateTimeの基本的な使い方
2. ZonedDateTimeの基本的な使い方

例えば現在の日本時間(JST)を取得したい場合、次のように記述します。


import java.time.ZonedDateTime;
import java.time.ZoneId;

public class TimeExample {
    public static void main(String[] args) {
        ZonedDateTime nowInTokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
        System.out.println("日本時間: " + nowInTokyo);
    }
}

日本時間: 2025-09-03T14:30:15.123+09:00[Asia/Tokyo]

ZoneId.of("Asia/Tokyo")で、明示的に「東京(JST)」のタイムゾーンを指定しています。タイムゾーンの指定には、IANAで定められたタイムゾーンIDを使用します。

3. ZonedDateTimeのタイムゾーン変換(タイムゾーンを変更する)

3. ZonedDateTimeのタイムゾーン変換(タイムゾーンを変更する)
3. ZonedDateTimeのタイムゾーン変換(タイムゾーンを変更する)

現在の日本時間を、たとえばアメリカのロサンゼルス時間(PST)に変換したい場合は、withZoneSameInstant()を使います。


import java.time.ZonedDateTime;
import java.time.ZoneId;

public class ZoneConversionExample {
    public static void main(String[] args) {
        ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
        ZonedDateTime laTime = tokyoTime.withZoneSameInstant(ZoneId.of("America/Los_Angeles"));
        System.out.println("東京時間: " + tokyoTime);
        System.out.println("ロサンゼルス時間: " + laTime);
    }
}

東京時間: 2025-09-03T14:30:15.123+09:00[Asia/Tokyo]
ロサンゼルス時間: 2025-09-02T22:30:15.123-07:00[America/Los_Angeles]

同じ瞬間を別のタイムゾーンで表すことができるため、グローバルアプリでは非常に重要な機能です。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. ZonedDateTimeとフォーマットの指定

4. ZonedDateTimeとフォーマットの指定
4. ZonedDateTimeとフォーマットの指定

ZonedDateTimeDateTimeFormatterと一緒に使うことで、自由な形式で日付を表示できます。


import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class FormatterExample {
    public static void main(String[] args) {
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z VV");
        String formatted = now.format(formatter);
        System.out.println("フォーマット済み: " + formatted);
    }
}

フォーマット済み: 2025-09-03 14:30:15 JST Asia/Tokyo

zは略称(JSTなど)、VVはタイムゾーンID(Asia/Tokyo)を表します。

5. ZonedDateTimeとLocalDateTimeの違い

5. ZonedDateTimeとLocalDateTimeの違い
5. ZonedDateTimeとLocalDateTimeの違い

初心者が混乱しやすいのがLocalDateTimeとの違いです。LocalDateTimeはタイムゾーン情報を含まないため、「どこの国の時間か」が分かりません。一方、ZonedDateTimeはタイムゾーン込みなので、国や地域ごとに正確な時刻管理ができます。

たとえばサーバーはUTC、ユーザーはJSTで処理したいといった場合にはZonedDateTimeが大活躍します。

6. 代表的なZoneId(タイムゾーンID)一覧

6. 代表的なZoneId(タイムゾーンID)一覧
6. 代表的なZoneId(タイムゾーンID)一覧

Javaでは多くのタイムゾーンIDが定義されています。以下に代表的なものを紹介します:

  • Asia/Tokyo:日本
  • UTC:協定世界時
  • America/New_York:アメリカ東部
  • Europe/London:イギリス
  • Asia/Shanghai:中国

タイムゾーンIDは厳密に定義されているため、正しい文字列を使用することが重要です。

7. ZonedDateTimeの注意点とベストプラクティス

7. ZonedDateTimeの注意点とベストプラクティス
7. ZonedDateTimeの注意点とベストプラクティス

複数タイムゾーンを扱うアプリでは、以下の点に注意しましょう:

  • 保存はUTC、表示はユーザーのタイムゾーンに変換
  • 外部APIと連携する場合はInstantZonedDateTimeで受け渡す
  • システムでタイムゾーンを統一しておくとバグが減る

また、Instantとの相互変換も可能です。


import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class InstantConversion {
    public static void main(String[] args) {
        Instant now = Instant.now();
        ZonedDateTime zdt = now.atZone(ZoneId.of("Asia/Tokyo"));
        System.out.println("Instant → ZonedDateTime: " + zdt);
    }
}

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JavaのZonedDateTimeとはどのようなクラスですか?初心者にもわかりやすく教えてください。

JavaのZonedDateTimeは、java.timeパッケージに含まれる非常に便利なクラスです。最大の特徴は「日付」「時刻」に加えて「タイムゾーン(時差情報)」の3つのデータをセットで保持できる点にあります。プログラミング初心者が日付操作を行う際、日本国内だけのシステムなら意識しなくても済むことが多いですが、世界中で使われるウェブアプリケーションや、海外のサーバーと通信するプログラムを開発する場合には、このZonedDateTimeを使ってタイムゾーン付きの日付・時刻を正確に扱うことが必須となります。例えば、日本標準時(JST)や協定世界時(UTC)などを明示的に指定して、正確な現在の時刻を取得したり、表示したりすることが可能になります。
Javaの例外処理の一覧へ
新着記事
Python
NumPyのdtypeとは?データ型の意味と仕組みを初心者向けに解説
NumPyのdtypeとは?データ型の意味と仕組みを初心者向けに徹底解説
Dart
Dartのクラスの作り方!定義・インスタンス生成の基礎
Dartのクラスの作り方を完全解説!初心者でも理解できるクラス定義とインスタンス生成の基礎
Java
Javaの同一性と同値性
Javaの同一性と同値性をわかりやすく解説!初心者向けの基礎知識
AWS
【AWS】s3 lsコマンドの使い方まとめ【オプション・ワイルドカード・日付指定】
【AWS】s3 lsコマンドの使い方まとめ【オプション・ワイルドカード・日付指定】
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク