Java 中處理日期時間常見需求包括取得當前時間各欄位、解析指定格式字串、格式化輸出等。本文示範使用 java.util.Calendar 與 java.text.SimpleDateFormat 完成基本操作,並補充現代 java.time 套件的建議用法。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateTimeDemo {
public static void main(String[] args) {
System.out.println("=== 獲取當前日期時間 ===");
printCurrentDateTime();
System.out.println("\n=== 解析指定字串日期時間 ===");
printCustomDateTime("2013-11-10 18:45:39");
}
// 獲取當前時間各欄位
private static void printCurrentDateTime() {
Calendar cal = Calendar.getInstance();
printCalendarFields(cal);
}
// 解析指定格式字串並獲取欄位
private static void printCustomDateTime(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
try {
Date date = sdf.parse(dateStr);
cal.setTime(date);
} catch (ParseException e) {
System.err.println("日期解析失敗:" + e.getMessage());
return;
}
printCalendarFields(cal);
}
// 統一輸出 Calendar 各欄位
private static void printCalendarFields(Calendar cal) {
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1; // 月份從 0 開始
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY); // 24 小制
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
System.out.printf("年:%d%n月:%d%n日:%d%n時:%d%n分:%d%n秒:%d%n",
year, month, day, hour, minute, second);
}
}
Calendar.JANUARY = 0,取得月份時需 +1。SimpleDateFormat 非執行緒安全,多執行緒環境請使用 ThreadLocal 或每次新建實例。Calendar.getInstance() 使用系統預設時區,跨時區應用需明確設定 setTimeZone()。Java 8 引入 java.time 套件(JSR-310),API 設計更清晰、不可變、執行緒安全。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;
public class ModernDateTimeDemo {
public static void main(String[] args) {
// 當前時間
LocalDateTime now = LocalDateTime.now();
System.out.println("當前:" + now);
// 解析字串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime custom = LocalDateTime.parse("2013-11-10 18:45:39", formatter);
System.out.println("指定:" + custom);
// 取得各欄位
System.out.printf("年:%d 月:%d 日:%d 時:%d 分:%d 秒:%d%n",
custom.getYear(), custom.getMonthValue(), custom.getDayOfMonth(),
custom.getHour(), custom.getMinute(), custom.getSecond());
// 格式化輸出
String formatted = custom.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒"));
System.out.println("格式化:" + formatted);
}
}
| 特性 | Calendar / Date | java.time |
|---|---|---|
| 不可變性 | 可變 | 不可變(執行緒安全) |
| API 設計 | 繁瑣、易混淆 | 流暢、語意清晰 |
| 時區處理 | 隱含、易出錯 | 顯式 ZonedDateTime |
| 解析/格式化 | SimpleDateFormat(非安全) | DateTimeFormatter(安全) |
維護舊專案時仍會遇到 Calendar 與 SimpleDateFormat,掌握其用法與坑點很重要。新專案或重構時,請優先採用 java.time 套件,能大幅減少日期時間處理的 Bug。