核心程式碼
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
public class TimeZoneDemo {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance(); // 當前預設時區時間
// 洛杉磯時間 (America/Los_Angeles)
sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
System.out.println("Los_Angeles: " + sdf.format(cal.getTime()));
// 上海時間 (Asia/Shanghai)
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println("Shanghai: " + sdf.format(cal.getTime()));
}
}
執行範例輸出
Los_Angeles: 2024/01/15 03:45:22
Shanghai: 2024/01/15 19:45:22
關鍵點解析
| 類別 | 說明 |
Calendar.getInstance() | 取得預設時區(JVM 啟動參數 user.timezone 或作業系統設定)的當前瞬間 |
SimpleDateFormat.setTimeZone() | 改變格式化輸出的時區,不改變 Calendar 內部瞬間 |
TimeZone.getTimeZone(id) | IANA 時區資料庫 ID,如 America/Los_Angeles、Asia/Shanghai、UTC |
現代替代方案 (Java 8+)
import java.time.*;
import java.time.format.DateTimeFormatter;
public class ModernTimeZoneDemo {
public static void main(String[] args) {
Instant now = Instant.now(); // UTC 瞬間
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
ZonedDateTime la = now.atZone(ZoneId.of("America/Los_Angeles"));
ZonedDateTime sh = now.atZone(ZoneId.of("Asia/Shanghai"));
System.out.println("Los_Angeles: " + la.format(fmt));
System.out.println("Shanghai: " + sh.format(fmt));
}
}
java.time 為不可變、線程安全、API 更清晰。
ZoneId 自動處理夏令時間規則(IANA 資料庫)。
- 舊代碼維護可用
DateTimeFormatter.ofPattern 替代 SimpleDateFormat。
常見時區 ID 對照
UTC // 協調世界時
America/Los_Angeles // 洛杉磯 (PST/PDT)
America/New_York // 紐約 (EST/EDT)
Europe/London // 倫敦 (GMT/BST)
Asia/Shanghai // 上海/北京 (CST, 無夏令時間)
Asia/Tokyo // 東京 (JST)
Australia/Sydney // 雪梨 (AEST/AEDT)