java.util.TimeZone 表示時區偏移量並處理夏令時 (DST)。所有日期/時間類 (Date、Calendar、DateFormat) 格式化輸出時均依賴時區上下文。
TimeZone tz = TimeZone.getDefault(); // JVM 啟動時從 OS 獲取,可通過 -Duser.timezone 指定
TimeZone china = TimeZone.getTimeZone("GMT+08:00");
TimeZone chongqing = TimeZone.getTimeZone("Asia/Chongqing");
所有支持 ID 列表:
String[] ids = TimeZone.getAvailableIDs();
// 輸出包含: Etc/GMT+12, Pacific/Midway, ..., Asia/Shanghai, Asia/Chongqing, ..., Pacific/Kiritimati
| 方法 | 說明 |
|---|---|
getID() | 返回標準 ID (如 "Asia/Shanghai") |
getDisplayName(Locale) | 本地化顯示名 (如 "中國標準時間") |
getRawOffset() | 基礎偏移量 (毫秒),不含 DST |
getOffset(long time) | 指定時間點實際偏移 (含 DST) |
inDaylightTime(Date) | 判斷該時刻是否在夏令時 |
useDaylightTime() | 該時區是否觀察夏令時 |
setRawOffset(int) | 設置基礎偏移 (罕用) |
Date date = new Date(113, 8, 19, 14, 22, 30); // 2013-09-19 14:22:30
DateFormat df = DateFormat.getInstance();
TimeZone tz1 = TimeZone.getDefault();
df.setTimeZone(tz1);
System.out.println(tz1.getID() + " : " + df.format(date));
TimeZone tz2 = TimeZone.getTimeZone("GMT+08:00");
df.setTimeZone(tz2);
System.out.println(tz2.getID() + " : " + df.format(date));
TimeZone tz3 = TimeZone.getTimeZone("America/New_York");
df.setTimeZone(tz3);
System.out.println(tz3.getID() + " : " + df.format(date));
輸出:
Asia/Shanghai : 13-9-19 下午2:22
GMT+08:00 : 13-9-19 下午2:22
America/New_York : 13-9-19 上午2:22
Asia/Shanghai、America/New_York (IANA 時區數據庫標準,含歷史 DST 規則)GMT+08:00、UTC-05:00 (固定偏移,無 DST)CST、PST (歧義大,不推薦)最佳實踐:始終使用 Asia/Shanghai 風格 ID,避免縮寫歧義,確保歷史時間正確轉換。
Java TimeZone 內嵌 IANA 時區數據庫,隨 JDK 更新發布 DST 規則變更。