示範使用 Calendar、TimeZone 取得指定時區(GMT+8)的當前時間戳,並轉為 Timestamp 後拆解年月日進行格式化輸出。
package com.infomorrow.dao;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.TimeZone;
import org.junit.Test;
public class DateDemo {
@Test
public void testCurrentDate() {
// 取得 GMT+8 時區的當前毫秒數
Timestamp now = new Timestamp(
Calendar.getInstance(TimeZone.getTimeZone("GMT+8")).getTimeInMillis()
);
// Timestamp 繼承 java.util.Date,getYear()/getMonth()/getDate() 已棄用但仍可用
int year = now.getYear() + 1900; // getYear() 回傳距 1900 年的偏移量
int month = now.getMonth() + 1; // getMonth() 0~11
int day = now.getDate(); // 1~31
String formatted = String.format("%d-%02d-%02d", year, month, day);
System.out.println("date: " + formatted); // 例:date: 2013-12-17
System.out.println(now); // 例:2013-12-17 13:04:30.809
}
}
使用 java.time 套件,API 更清晰、不可變、執行緒安全:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class ModernDateDemo {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Taipei")); // GMT+8
String formatted = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println("date: " + formatted);
System.out.println(now); // 2024-05-20T14:30:45.123
}
}
| 特性 | Calendar / Timestamp (舊 API) | java.time (新 API) |
|---|---|---|
| 執行緒安全 | 否 (Calendar 可變) | 是 (不可變物件) |
| 時區處理 | TimeZone 較繁瑣 | ZoneId 直觀 |
| 格式化 | SimpleDateFormat 非執行緒安全 | DateTimeFormatter 執行緒安全 |
| 月份索引 | 0-based (0=一月) | 1-based (1=一月) |
結論:新專案請優先使用 java.time;維護舊代碼時注意 Calendar 月份 0-based 與 Timestamp 年份偏移 1900 的坑。