| 類別 | 包 | 角色 | 狀態 |
|---|---|---|---|
Date | java.util | 時間戳容器(毫秒精度),大多方法已棄用 | 舊 API,仍廣泛使用 |
Calendar | java.util | 日曆運算抽象基類,GregorianCalendar 為具體實現 | 舊 API,功能完整 |
DateFormat/SimpleDateFormat | java.text | 日期↔字串格式化/解析,非執行緒安全 | 舊 API,需注意併發 |
※ Java 8+ 建議使用 java.time 套件(LocalDateTime、DateTimeFormatter 等),不可變、執行緒安全、API 更豐富。
// 自定義格式
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
System.out.println(sdf.format(date)); // 例:Thursday-January-27-2005
// 標準格式(Locale 敏感)
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
System.out.println(df.format(date)); // 例:2005/1/27 上午 11:30
DateFormat fmt = DateFormat.getDateInstance(DateFormat.FULL);
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date()); // 同步當前時間
System.out.println("系統時間: " + fmt.format(cal.getTime()));
// 設定為本週五(保持時分秒不變)
cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);
System.out.println("設定後: " + fmt.format(cal.getTime()));
// 若今天週三,輸出將變為本週五同一時刻
YEAR、MONTH(0-11)、DAY_OF_MONTH、HOUR_OF_DAY(24制)、MINUTE、SECOND、MILLISECONDDAY_OF_WEEK(SUNDAY=1 ... SATURDAY=7)WEEK_OF_YEAR、WEEK_OF_MONTH
// 加減時間
cal.add(Calendar.DAY_OF_MONTH, 10); // 10 天后
cal.add(Calendar.MONTH, -1); // 1 月前
// 比較日期
Date d1 = cal.getTime();
Date d2 = new Date();
int cmp = d1.compareTo(d2); // -1/0/1
// 字串解析為 Date
String str = "2024-12-25 15:30:00";
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parsed = parser.parse(str); // 拋 ParseException
ThreadLocal<SimpleDateFormat> 快取。DateTimeFormatter(不可變、執行緒安全)。Calendar 亦非執行緒安全,避免跨線程共享實例。
// 當前日期時間
LocalDateTime now = LocalDateTime.now();
// 格式化
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String str = now.format(fmt);
// 解析
LocalDateTime parsed = LocalDateTime.parse("2024-12-25 15:30:00", fmt);
// 運算(不可變,返回新物件)
LocalDateTime future = now.plusDays(10).minusHours(2);
// 區間
Duration d = Duration.between(now, future);
Period p = Period.between(now.toLocalDate(), future.toLocalDate());
新 API 設計更符合直覺,強烈建議新專案採用。