java.util.Date 是 Java 處理日期時間的基礎類別,雖然 JDK 1.1 後推出 Calendar 與 DateFormat 取代其大部分方法,但理解 Date 類別運作原理仍是掌握 Java 時間處理的關鍵。本文系統整理 Date 類別的建構子、核心方法、比較操作與格式化技巧,並說明棄用方法的現代替代方案。
Date 類別實際精確到毫秒,儲存的是相對於 GMT 1970年1月1日 00:00:00 的毫秒數。命名為 "Date" 實為歷史遺留,實際功能涵蓋日期與時間。
<%@ page import="java.util.*" %>
因 java.sql 也有同名 Date 類別,建議完整寫法 java.util.Date 避免衝突。
| 建構子 | 說明 | 狀態 |
|---|---|---|
Date() |
建立代表當前時間的 Date 物件 | 推薦使用 |
Date(long date) |
依指定毫秒數(相對 GMT 1970/01/01)建立物件 | 推薦使用 |
Date(int year, int month, int date) |
年(減1900)、月(0-11)、日 建立午夜時間 | 已棄用 → 使用 Calendar |
Date(int year, int month, int date, int hrs, int min) |
含時、分 | 已棄用 → 使用 Calendar |
Date(int year, int month, int date, int hrs, int min, int sec) |
含時、分、秒 | 已棄用 → 使用 Calendar |
Date(String s) |
解析字串建立物件 | 已棄用 → 使用 DateFormat.parse() |
參數關鍵規則:
| 舊方法 | 現代替代方案 |
|---|---|
parse(String s) |
DateFormat.parse(String) |
toLocaleString() |
DateFormat.format(Date) |
toGMTString() |
DateFormat.format(Date) (設定 GMT TimeZone) |
parse() 能解析多種格式,如 "Sat, 12 Aug 1995 13:30:00 GMT",支援時區縮寫(EST/PST 等)與偏移量(GMT+0430)。
| 舊方法 | 回傳值 | 現代替代 |
|---|---|---|
getYear() | 年份-1900 | Calendar.get(Calendar.YEAR) |
getMonth() | 0-11 | Calendar.get(Calendar.MONTH) |
getDate() | 1-31 | Calendar.get(Calendar.DAY_OF_MONTH) |
getDay() | 0=週日...6=週六 | Calendar.get(Calendar.DAY_OF_WEEK) |
getHours() | 0-23 | Calendar.get(Calendar.HOUR_OF_DAY) |
getMinutes() | 0-59 | Calendar.get(Calendar.MINUTE) |
getSeconds() | 0-61(含閏秒) | Calendar.get(Calendar.SECOND) |
setYear()、setMonth()、setDate()、setHours()、setMinutes()、setSeconds() 全部對應 Calendar.set() 相關欄位。
| 方法 | 功能 | 回傳值 |
|---|---|---|
before(Date) | 是否早於指定日期 | boolean |
after(Date) | 是否晚於指定日期 | boolean |
equals(Object) | 毫秒精度相等 | boolean |
compareTo(Date) | 比較先後順序 | int (負/0/正) |
getTime():取得毫秒長整數setTime(long):設定毫秒長整數clone():建立副本(Date 為可變物件,傳遞時建議 clone)hashCode():基於 getTime() 計算雜湊碼toString():輸出格式 "dow mon dd hh:mm:ss zzz yyyy"(如 Wed Nov 08 13:30:00 CST 2023)getTimezoneOffset():取得時區偏移分鐘數(已棄用 → Calendar.ZONE_OFFSET + DST_OFFSET)// 當前時間
LocalDateTime now = LocalDateTime.now();
// 指定日期時間
LocalDateTime dt = LocalDateTime.of(2024, 3, 15, 14, 30, 0);
// 格式化
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String str = dt.format(fmt);
// 解析
LocalDateTime parsed = LocalDateTime.parse("2024-03-15 14:30:00", fmt);
// 時區處理
ZonedDateTime zdt = dt.atZone(ZoneId.of("Asia/Taipei"));
// 取得 Calendar 實例
Calendar cal = Calendar.getInstance();
cal.setTime(dateObj); // 從 Date 轉換
// 設定日期
cal.set(2024, Calendar.MARCH, 15, 14, 30, 0);
// 格式化輸出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatted = sdf.format(cal.getTime());
parse() 失敗拋出 ParseException,必須 try-catch雖然 java.util.Date 大部分方法已棄用,但其「毫秒長整數」核心設計延續至今。現代開發應全面遷移至 java.time 套件(Java 8+),維護舊代碼時正確使用 Calendar 與 DateFormat/SimpleDateFormat 替代棄用方法。理解 Date 類別演進歷程,有助於寫出更健壯、可維護的時間處理代碼。