自 Java 8 起,強烈建議使用 java.time 套件,取代老舊的 Date、Calendar、SimpleDateFormat。新 API 具備不可變性、執行緒安全、API 直觀等優勢。
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedNow = now.format(formatter);
System.out.println("當前時間:" + formattedNow);
LocalDateTime yesterday = now.minusDays(1);
String formattedYesterday = yesterday.format(formatter);
System.out.println("前一天:" + formattedYesterday);
package com.example.datetime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeDemo {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
LocalDateTime yesterday = now.minusDays(1);
System.out.println("當前時間:" + now.format(formatter));
System.out.println("前一天:" + yesterday.format(formatter));
// 進階:獲取本週一、本月第一天等
System.out.println("本週一:" + now.with(java.time.temporal.TemporalAdjusters.previousOrSame(java.time.DayOfWeek.MONDAY)).format(formatter));
System.out.println("本月第一天:" + now.withDayOfMonth(1).format(formatter));
}
}
若專案仍停留在 Java 7 或更早版本,可使用 Calendar:
import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;
public class LegacyDateDemo {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.add(Calendar.DAY_OF_MONTH, -1); // 減一天
Date yesterday = cal.getTime();
System.out.println("當前:" + sdf.format(now));
System.out.println("前一天:" + sdf.format(yesterday));
}
}
| 問題 | 錯誤做法 | 正確做法 |
|---|---|---|
| 執行緒安全 | static SimpleDateFormat 共用 | 使用 DateTimeFormatter(不可變、執行緒安全)或 ThreadLocal |
| 時區處理 | 忽略時區,直接用 Date | 使用 ZonedDateTime 或 OffsetDateTime 明確指定時區 |
| 效能 | 頻繁創建 SimpleDateFormat | DateTimeFormatter 可重複使用;或預編譯格式化器 |
| 可讀性 | Calendar.add(Calendar.DATE, -1) | LocalDateTime.minusDays(1) 語意清晰 |
public class DateUtils {
private static final DateTimeFormatter STANDARD_FMT =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String now() {
return LocalDateTime.now().format(STANDARD_FMT);
}
public static String yesterday() {
return LocalDateTime.now().minusDays(1).format(STANDARD_FMT);
}
public static String format(LocalDateTime dateTime) {
return dateTime.format(STANDARD_FMT);
}
public static LocalDateTime parse(String str) {
return LocalDateTime.parse(str, STANDARD_FMT);
}
}
java.time.LocalDateTime / ZonedDateTimeCalendar 寫法,但新增代碼盡量隔離遷移DateTimeFormatter,定義為常數複用TemporalAdjusters 處理「本月最後一天」、「下個工作日」等複雜邏輯