首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 時間處理系列 (7):TimeZone 時區詳解與實戰

     編輯:Java 相關知識

TimeZone 核心作用

java.util.TimeZone 表示時區偏移量並處理夏令時 (DST)。所有日期/時間類 (Date、Calendar、DateFormat) 格式化輸出時均依賴時區上下文。

兩種常用創建方式

1. 獲取默認時區

TimeZone tz = TimeZone.getDefault(); // JVM 啟動時從 OS 獲取,可通過 -Duser.timezone 指定

2. 指定 ID 獲取時區

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

關鍵 API

方法說明
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

ID 命名規範

  • 地區/城市:Asia/Shanghai、America/New_York (IANA 時區數據庫標準,含歷史 DST 規則)
  • GMT 偏移:GMT+08:00、UTC-05:00 (固定偏移,無 DST)
  • 舊式縮寫:CST、PST (歧義大,不推薦)

最佳實踐:始終使用 Asia/Shanghai 風格 ID,避免縮寫歧義,確保歷史時間正確轉換。

GMT、UTC、時區關係補充

  • GMT:格林威治平均太陽時,天文觀測基準
  • UTC:國際原子時 + 閏秒修正,現代時間標準,精度優於 GMT
  • 時區:以本初子午線 (格林威治) 為零點,每 15° 劃分一區,東區早、西區晚
  • 夏令時 (DST):夏季人為調快 1 小時,節約能源,規則由各國政府定義,頻繁變更

Java TimeZone 內嵌 IANA 時區數據庫,隨 JDK 更新發布 DST 規則變更。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved