Java 的 java.util.Date 類自 JDK 1.0 起隨平台發展至今。早期版本僅提供簡單的獲取年、月、日等方法,但這些方法因國際化支持不足而備受詬病,後來在 JDK 1.1 中被標記為過時,並遷移至 Calendar 類。現今,Date 本質上是一個輕量級包裝器,內部封裝一個 long 值,代表從 GMT 時間 1970 年 1 月 1 日 00:00:00 起經過的毫秒數。
最常見的用法是使用無參構造函數,它會自動調用 System.currentTimeMillis() 獲取當前系統時間:
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.getTime()); // 輸出毫秒數,例如 1001803809710
}
}
此毫秒值是跨平台、時區無關的絕對時間基準,適合存儲、傳輸及比較。
若需將時間戳轉為人類可讀格式,java.text.SimpleDateFormat 是首選工具。通過模式字符串可精確控制輸出樣式:
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatExample {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
Date now = new Date();
System.out.println(sdf.format(now)); // 例如:Saturday-September-29-2001
}
}
模式字母重複次數決定輸出長度:EEEE 顯示完整星期名,EE 則為縮寫;同理 MMMM 對比 MM,yyyy 對比 yy。
反向操作同樣簡單,調用 parse() 方法並捕獲 ParseException:
import java.text.SimpleDateFormat;
import java.util.Date;
public class ParseExample {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
String input = "9-29-2001";
try {
Date date = sdf.parse(input);
System.out.println(date.getTime()); // 輸出對應毫秒數
} catch (Exception e) {
System.err.println("解析失敗:" + e.getMessage());
}
}
}
DateFormat.getDateTimeInstance() 提供四種預定義風格,無需手寫模式即可獲得本地化輸出:
import java.text.DateFormat;
import java.util.Date;
public class BuiltinFormatExample {
public static void main(String[] args) {
Date now = new Date();
System.out.println("SHORT: " + DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(now));
System.out.println("MEDIUM: " + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(now));
System.out.println("LONG: " + DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(now));
System.out.println("FULL: " + DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).format(now));
}
}
輸出示例(視區域設置而定):
SimpleDateFormat 非線程安全,多線程環境下請使用 ThreadLocal 或 Java 8+ 的 DateTimeFormatter。Date 本身無時區概念,格式化/解析時默認使用 JVM 默認時區,跨時區應用請顯式設置 TimeZone。java.time 包(LocalDateTime、ZonedDateTime、DateTimeFormatter),API 設計更符合直覺且線程安全。