Java : ZoneId (タイムゾーンID) - API使用例
ZoneId (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
タイムゾーンID(ヨーロッパ/パリなど)。
ZoneId は、地理的な地域ごとのタイムゾーンを定義します。
例えば日本標準時は "Asia/Tokyo" として定義されています。時差(オフセット) は +9時間です。
final var zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // Asia/Tokyo
final var dateTime = ZonedDateTime.of(
LocalDate.of(2022, 11, 10),
LocalTime.of(0, 0),
zoneId);
System.out.println(dateTime); // 2022-11-10T00:00+09:00[Asia/Tokyo]
似たAPIに、ZoneOffset があります。
ZoneId と ZoneOffset の違いについては別途記事にしていますので、そちらもご参照ください。
補足
// ZoneRulesException: Unknown time-zone ID: JST
final var id = ZoneId.of("JST");
が発生する場合は、
final var id = ZoneId.of("JST", ZoneId.SHORT_IDS);
System.out.println(id); // "Asia/Tokyo"
もしくは
final var id = ZoneId.of("Asia/Tokyo");
System.out.println(id); // "Asia/Tokyo"
をお試しください。
フィールド
static final Map<String,String> SHORT_IDS
短いタイムゾーン名を使用できるようにするためのゾーン・オーバーライドのマップです。
ZoneId.of(String zoneId, Map<String,String> aliasMap)に指定して使います。
日本時間としてはJST=Asia/Tokyoがあります。
//ACT=Australia/Darwin
//AET=Australia/Sydney
//AGT=America/Argentina/Buenos_Aires
//ART=Africa/Cairo
//AST=America/Anchorage
//BET=America/Sao_Paulo
//BST=Asia/Dhaka
//CAT=Africa/Harare
//CNT=America/St_Johns
//CST=America/Chicago
//CTT=Asia/Shanghai
//EAT=Africa/Addis_Ababa
//ECT=Europe/Paris
//EST=-05:00
//HST=-10:00
//IET=America/Indiana/Indianapolis
//IST=Asia/Kolkata
//JST=Asia/Tokyo
//MIT=Pacific/Apia
//MST=-07:00
//NET=Asia/Yerevan
//NST=Pacific/Auckland
//PLT=Asia/Karachi
//PNT=America/Phoenix
//PRT=America/Puerto_Rico
//PST=America/Los_Angeles
//SST=Pacific/Guadalcanal
//VST=Asia/Ho_Chi_Minh
ZoneId.SHORT_IDS.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(System.out::println);
メソッド
boolean equals (Object obj)
このタイムゾーンIDが別のタイムゾーンIDと等しいかどうかをチェックします。
final var zoneId1 = ZoneId.systemDefault();
System.out.println(zoneId1); // Asia/Tokyo
final var zoneId2 = ZoneId.of("Asia/Tokyo");
System.out.println(zoneId2); // Asia/Tokyo
System.out.println(zoneId1 != zoneId2); // true
System.out.println(zoneId1.equals(zoneId2)); // true
final var zoneId1 = ZoneId.ofOffset("GMT", ZoneOffset.ofHours(12));
System.out.println(zoneId1); // GMT+12:00
final var zoneId2 = ZoneId.ofOffset("GMT", ZoneOffset.ofHours(3));
System.out.println(zoneId2); // GMT+03:00
final var zoneId3 = ZoneId.of("GMT");
System.out.println(zoneId3); // GMT
System.out.println(zoneId1.equals(zoneId2)); // false
System.out.println(zoneId1.equals(zoneId3)); // false
System.out.println(zoneId1.equals(zoneId3)); // false
static ZoneId from (TemporalAccessor temporal)
時間的オブジェクトからZoneIdのインスタンスを取得します。
final var temporal = ZonedDateTime.of(2021, 4, 7, 12, 30, 45, 0, ZoneId.systemDefault());
System.out.println(temporal); // 2021-04-07T12:30:45+09:00[Asia/Tokyo]
final var zoneId = ZoneId.from(temporal);
System.out.println(zoneId); // Asia/Tokyo
final var temporal = LocalDateTime.of(2021, 4, 7, 12, 30);
System.out.println(temporal); // 2021-04-07T12:30
//ZoneId.from(temporal); // DateTimeException: Unable to obtain ZoneId from TemporalAccessor
static Set<String> getAvailableZoneIds ()
利用可能なゾーンIDのセットを取得します。
//Africa/Abidjan
//Africa/Accra
//Africa/Addis_Ababa
//Africa/Algiers
//... 省略 ...
//Asia/Tokyo
//... 省略 ...
//GMT
//... 省略 ...
//UTC
//... 省略 ...
ZoneId.getAvailableZoneIds().stream().sorted().forEach(System.out::println);
String getDisplayName (TextStyle style, Locale locale)
「英国時間」や「+02:00」など、ゾーンのテキスト表現を取得します。
final var zoneId = ZoneId.of("Asia/Tokyo");
System.out.println(zoneId); // Asia/Tokyo
System.out.println(zoneId.getDisplayName(TextStyle.FULL, Locale.JAPANESE)); // "日本時間"
System.out.println(zoneId.getDisplayName(TextStyle.SHORT, Locale.JAPANESE)); // "GMT+09:00"
System.out.println(zoneId.getDisplayName(TextStyle.NARROW, Locale.JAPANESE)); // "Asia/Tokyo"
System.out.println(zoneId.getDisplayName(TextStyle.FULL, Locale.ENGLISH)); // "Japan Time"
System.out.println(zoneId.getDisplayName(TextStyle.SHORT, Locale.ENGLISH)); // "JT"
System.out.println(zoneId.getDisplayName(TextStyle.NARROW, Locale.ENGLISH)); // "Asia/Tokyo"
abstract String getId ()
一意のタイムゾーンIDを取得します。
System.out.println(ZoneId.of("Asia/Tokyo").getId()); // "Asia/Tokyo"
System.out.println(ZoneId.ofOffset("GMT", ZoneOffset.ofHours(12)).getId()); // "GMT+12:00"
abstract ZoneRules getRules ()
計算の実行を許可する、このIDのタイムゾーン・ルールを取得します。
final var rules = ZoneId.of("Asia/Tokyo").getRules();
System.out.println(rules); // ZoneRules[currentStandardOffset=+09:00]
final var rules = ZoneId.of("Europe/Paris").getRules();
System.out.println(rules); // ZoneRules[currentStandardOffset=+01:00]
final var rules = ZoneId.ofOffset("GMT", ZoneOffset.ofHours(12)).getRules();
System.out.println(rules); // ZoneRules[currentStandardOffset=+12:00]
int hashCode ()
このタイムゾーンIDのハッシュ・コード。
System.out.println(ZoneId.of("Asia/Tokyo").hashCode()); // -1660747039
System.out.println(ZoneId.ofOffset("GMT", ZoneOffset.ofHours(12)).hashCode()); // 90912348
ZoneId normalized ()
タイムゾーンIDを正規化し、可能な場合はZoneOffsetを返します。
final var zoneId = ZoneId.ofOffset("GMT", ZoneOffset.ofHours(12));
System.out.println(zoneId); // GMT+12:00
System.out.println(zoneId.normalized()); // +12:00
final var zoneId = ZoneId.of("Asia/Tokyo");
System.out.println(zoneId); // Asia/Tokyo
System.out.println(zoneId.normalized()); // Asia/Tokyo
final var zoneId = ZoneOffset.ofHours(2);
System.out.println(zoneId); // +02:00
System.out.println(zoneId.normalized()); // +02:00
final var zoneId = ZoneOffset.UTC;
System.out.println(zoneId); // Z
System.out.println(zoneId.normalized()); // Z
static ZoneId of (String zoneId)
IDからZoneIdのインスタンスを取得し、IDが有効で使用できることを確認します。
System.out.println(ZoneId.of("Asia/Tokyo")); // Asia/Tokyo
System.out.println(ZoneId.of("+02:00")); // +02:00
System.out.println(ZoneId.of("-12:00")); // -12:00
System.out.println(ZoneId.of("Z")); // Z
System.out.println(ZoneId.of("UTC")); // UTC
System.out.println(ZoneId.of("UT")); // UT
System.out.println(ZoneId.of("GMT")); // GMT
System.out.println(ZoneId.of("UTC+09:00")); // UTC+09:00
//ZoneId.of("A"); // DateTimeException: Invalid ID for ZoneOffset, invalid format: A
//ZoneId.of("JST"); // ZoneRulesException: Unknown time-zone ID: JST
static ZoneId of (String zoneId, Map<String,String> aliasMap)
IDとZoneIdのインスタンスを取得し、別名マップを使用して標準ゾーンIDを補足します。
System.out.println(ZoneId.of("Asia/Tokyo")); // Asia/Tokyo
//ZoneId.of("JST"); // ZoneRulesException: Unknown time-zone ID: JST
System.out.println(ZoneId.of("JST", ZoneId.SHORT_IDS)); // Asia/Tokyo
static ZoneId ofOffset (String prefix, ZoneOffset offset)
ZoneIdのインスタンスを取得して、オフセットをラップします。
System.out.println(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(4))); // UTC+04:00
System.out.println(ZoneId.ofOffset("GMT", ZoneOffset.ofHours(-3))); // GMT-03:00
System.out.println(ZoneId.ofOffset("UT", ZoneOffset.of("+09:30:15"))); // UT+09:30:15
static ZoneId systemDefault ()
システム・デフォルト・タイムゾーンを取得します。
// 環境によって結果が変わることがあります。
System.out.println(ZoneId.systemDefault()); // Asia/Tokyo
String toString ()
IDを使用して、このゾーンをStringとして出力します。
このAPIはgetId()と同等となります。
API使用例はそちらのメソッドをご参照ください。
関連記事
- 日付・時刻の基本
- Date, CalendarではなくLocalDateTime, ZonedDateTimeを使おう
- 文字列と日付・時刻の変換
- 日時と曜日の計算
- 現在時刻(日時)の取得いろいろ
- 現在の曜日(DayOfWeek)を取得
- ZoneIdとZoneOffsetの違い
- API 使用例
- DateTimeException (日付・時刻の例外)
- DateTimeParseException (日付・時刻の解析例外)
- DayOfWeek (曜日)
- Duration (時間の量)
- LocalDate (日付・タイムゾーンなし)
- LocalDateTime (日時・タイムゾーンなし)
- LocalTime (時刻・タイムゾーンなし)
- Month (月)
- Instant (時点)
- OffsetDateTime (日時・オフセットあり)
- OffsetTime (時刻・オフセットあり)
- Period (日付の量)
- TemporalAdjusters (日時の調整ユーティリティ)
- Year (年)
- ZonedDateTime (日時・タイムゾーンあり)
- ZoneOffset (タイムゾーン・オフセット)