Java 早期 java.util.Date 與 Calendar 雖被 Java 8 新 API 取代,但在維護舊專案、理解底層原理時仍不可或缺。本文系統整理 Date 常用方法、SimpleDateFormat 格式化、printf 日期格式、字串轉日期、執行緒睡眠/計時、GregorianCalendar 實作,並附上 MVC 架構的萬年曆小程式完整原始碼。
| 類別 | 常用功能 |
|---|---|
Date | getTime()、before/after、compareTo、toString |
SimpleDateFormat | 自訂格式化/解析,支援 yyyy-MM-dd HH:mm:ss 等模式字元 |
printf / String.format | %tF、%tT、%1$tY 索引參數複用 |
GregorianCalendar | get()、add()、roll()、isLeapYear()、getActualMaximum() |
SimpleDateFormat ft = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println(ft.format(new Date())); // 輸出:Sun 2004.07.18 at 04:14:09 PM PDT
// 字串轉日期
String input = "2007-12-01";
Date d = new SimpleDateFormat("yyyy-MM-dd").parse(input);
Date now = new Date();
System.out.printf("%tc%n", now); // 完整日期時間
System.out.printf("%1$s %2$tB %2$td, %2$tY%n", "Due date:", now); // 索引複用
System.out.printf("%s %tB %<te, %<tY%n", "Due date:", now); // < 標記復用
long start = System.currentTimeMillis();
Thread.sleep(3000);
long diff = System.currentTimeMillis() - start; // 約 3000 ms
public int dayOfWeek(int d, int m, int y) {
if (m == 1) { m = 13; y--; }
if (m == 2) { m = 14; y--; }
return (d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7 + 1; // 1=週一
}
完整原始碼已整理於文章中,可直接複製執行。理解舊 API 不僅利於維護 Legacy Code,更能體會 Java 8 java.time 設計的優雅之處。