雖然 Java 8 java.time 已成主流,但大量存量專案仍使用 java.util.Date 與 java.util.Calendar。本文彙整兩大類**建立實例、日期格式化/解析、加減運算、比較大小、時區轉換、時間戳互轉**的高頻操作範例,並標註**執行緒安全陷阱**與**遷移建議**,兼顧維舊與新開發參考。
Date now = new Date(); // 當前時間
long ts = now.getTime(); // 毫秒時間戳 (1970 至今)
Date fromTs = new Date(ts); // 時間戳還原
Date fromSec = new Date(sec * 1000L); // 秒級時間戳轉換
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String str = sdf.format(now); // Date → String
Date parsed = sdf.parse("2024-05-20 15:30:00"); // String → Date
⚠️ SimpleDateFormat 非執行緒安全,多執行緒環境請用 ThreadLocal 或每次新建。
int cmp = date1.compareTo(date2); // -1/0/1
boolean before = date1.before(date2);
boolean after = date1.after(date2);
boolean equals = date1.equals(date2); // 精確到毫秒
Calendar cal = Calendar.getInstance(); // 當前時區/語系
Calendar calUTC = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Calendar calLocale = Calendar.getInstance(Locale.TAIWAN);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH); // 0~11 (1月=0)
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour24 = cal.get(Calendar.HOUR_OF_DAY);
int min = cal.get(Calendar.MINUTE);
int sec = cal.get(Calendar.SECOND);
int ms = cal.get(Calendar.MILLISECOND);
int dow = cal.get(Calendar.DAY_OF_WEEK); // 1=Sunday ... 7=Saturday
// 設定特定日期 (年,月-1,日)
cal.set(2024, Calendar.MAY, 20, 15, 30, 0);
cal.set(Calendar.YEAR, 2025);
// 加減運算 (自動進位/借位)
cal.add(Calendar.DAY_OF_MONTH, 10); // 加 10 天
cal.add(Calendar.MONTH, -3); // 減 3 個月
cal.roll(Calendar.DAY_OF_MONTH, 5); // 滾動:不改變更大欄位 (月/年)
Date date = cal.getTime(); // Calendar → Date
cal.setTime(date); // Date → Calendar
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");
System.out.println(sdf.format(cal.getTime()));
| 需求 | 代碼片段 |
|---|---|
| 取得本月第一天 00:00:00 | cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.HOUR_OF_DAY,0); cal.set(Calendar.MINUTE,0); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); |
| 取得本月最後一天 23:59:59.999 | cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); cal.set(Calendar.HOUR_OF_DAY,23); cal.set(Calendar.MINUTE,59); cal.set(Calendar.SECOND,59); cal.set(Calendar.MILLISECOND,999); |
| 判斷閏年 | cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365 |
| 計算兩日期天數差 | long diffDays = (date2.getTime() - date1.getTime()) / (1000*60*60*24); |
| 時區轉換 (Date 無時區,需 Calendar) | Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.setTime(date); // 現在 cal 以 UTC 解析 date 的年月日時分秒 |