JavaのZonedDateTimeクラスの使い方を完全ガイド!初心者でもわかる日付とタイムゾーンの操作
生徒
「Javaで世界中の時間を扱いたいんですが、タイムゾーン付きの日付ってどうやって扱うんですか?」
先生
「それならZonedDateTimeクラスがぴったりです。Javaのjava.timeパッケージで提供されている機能ですね。」
生徒
「なるほど、ZonedDateTimeって何ができるんですか?」
先生
「では、ZonedDateTimeの基本から使い方まで、一緒に見ていきましょう。」
1. ZonedDateTimeとは?
ZonedDateTimeは、Javaのjava.timeパッケージに含まれる日時クラスで、「日付・時刻・タイムゾーン」の3つの情報を同時に扱えるのが特徴です。
例えば、「日本時間の2025年9月4日 午後3時」を正確に表現し、他の国の時間帯と相互変換できます。java.util.DateやCalendarの時代には複雑だった操作が、ZonedDateTimeでかなり直感的になります。
2. ZonedDateTimeの基本的な使い方
以下は現在の日時をタイムゾーン付きで取得する基本的なコード例です。
import java.time.ZonedDateTime;
public class ZonedDateTimeExample {
public static void main(String[] args) {
ZonedDateTime now = ZonedDateTime.now();
System.out.println("現在の日時(タイムゾーン付き): " + now);
}
}
現在の日時(タイムゾーン付き): 2025-09-04T15:00+09:00[Asia/Tokyo]
このように、タイムゾーン情報(例:Asia/Tokyo)が自動的に付与されます。
3. 指定したタイムゾーンの日時を取得する
ZonedDateTimeはZoneIdと組み合わせることで、世界中のタイムゾーンに対応できます。
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class ZonedDateTimeWithZone {
public static void main(String[] args) {
ZonedDateTime nyTime = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println("ニューヨークの現在時刻: " + nyTime);
}
}
ニューヨークの現在時刻: 2025-09-04T02:00-04:00[America/New_York]
「America/New_York」など、IANA形式のゾーンIDを使用します。
4. ZonedDateTimeを文字列から作成する
LocalDateTimeとZoneIdを使って、任意の日時からZonedDateTimeを生成できます。
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class CreateZonedDateTime {
public static void main(String[] args) {
LocalDateTime ldt = LocalDateTime.of(2025, 12, 25, 10, 30);
ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("Asia/Tokyo"));
System.out.println("東京のクリスマス: " + zdt);
}
}
東京のクリスマス: 2025-12-25T10:30+09:00[Asia/Tokyo]
任意の日時を、タイムゾーン付きで表現できます。
5. 他のタイムゾーンへ変換する
ZonedDateTimeを別のタイムゾーンに変換するにはwithZoneSameInstantメソッドを使います。
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class ConvertTimeZone {
public static void main(String[] args) {
ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
ZonedDateTime londonTime = tokyoTime.withZoneSameInstant(ZoneId.of("Europe/London"));
System.out.println("東京の時刻: " + tokyoTime);
System.out.println("ロンドンの同時刻: " + londonTime);
}
}
東京の時刻: 2025-09-04T15:00+09:00[Asia/Tokyo]
ロンドンの同時刻: 2025-09-04T07:00+01:00[Europe/London]
世界の異なる拠点で同時刻を扱うときに非常に便利です。
6. ZonedDateTimeのフォーマットと解析
DateTimeFormatterを使えば、ZonedDateTimeを見やすい文字列にフォーマットできます。
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class FormatZonedDateTime {
public static void main(String[] args) {
ZonedDateTime now = ZonedDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm z");
String formatted = now.format(formatter);
System.out.println("フォーマット後: " + formatted);
}
}
フォーマット後: 2025/09/04 15:00 JST
解析(パース)もZonedDateTime.parse()で可能です。
7. ZonedDateTimeの便利な操作
日付や時間の加算・減算も簡単です。
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
public class AdjustZonedDateTime {
public static void main(String[] args) {
ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime nextWeek = now.plusWeeks(1);
ZonedDateTime oneHourBefore = now.minusHours(1);
System.out.println("1週間後: " + nextWeek);
System.out.println("1時間前: " + oneHourBefore);
}
}
1週間後: 2025-09-11T15:00+09:00[Asia/Tokyo]
1時間前: 2025-09-04T14:00+09:00[Asia/Tokyo]
ビジネスロジックでよく使う「日時の計算」もシンプルに行えます。
8. ZonedDateTimeとInstantの違い
InstantはUTCベースの「絶対時刻」、ZonedDateTimeは「人間が見やすい時間+タイムゾーン」です。
サーバー間通信やログ出力ではInstant、画面表示にはZonedDateTimeが適しています。
9. ZonedDateTimeのユースケース
- グローバルサービスでのユーザーごとの時間表示
- 航空券やイベントの現地時間管理
- スケジュールアプリのタイムゾーン対応
- 日付の変換・比較・保存の精度向上