Java 8 之前主要使用 java.util.Date、SimpleDateFormat 和 Calendar 處理日期時間,雖然存在線程不安全、設計混亂等問題,但在維護舊系統時仍需掌握。
關鍵警示:SimpleDateFormat 非線程安全,多執行緒共享實例會導致解析錯誤或數據錯亂。正確做法:
ThreadLocal 緩存DateTimeFormatter(線程安全)| 模式字母 | 含義 | 示例 |
|---|---|---|
| yyyy | 年份 | 2024 |
| MM | 月份 | 01-12 |
| dd | 日期 | 01-31 |
| HH | 24小時制 | 00-23 |
| mm | 分鐘 | 00-59 |
| ss | 秒 | 00-59 |
| SSS | 毫秒 | 000-999 |
public class VeDate {
// 獲取當前時間字符串 yyyy-MM-dd HH:mm:ss
public static String getStringDate() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
// 字符串轉 Date (yyyy-MM-dd)
public static Date strToDate(String strDate) {
return new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
}
// 計算兩日期間隔天數
public static long getDays(String date1, String date2) {
Date d1 = strToDate(date1);
Date d2 = strToDate(date2);
return (d1.getTime() - d2.getTime()) / (24 * 60 * 60 * 1000);
}
// 判斷閏年
public static boolean isLeapYear(String date) {
Calendar cal = Calendar.getInstance();
cal.setTime(strToDate(date));
int year = cal.get(Calendar.YEAR);
return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
// 獲取月份最後一天
public static String getEndDateOfMonth(String date) {
// ... 實現邏輯
}
}
Java 8 引入 LocalDate、LocalTime、LocalDateTime、ZonedDateTime 等不可變、線程安全的類:
// 現代寫法
LocalDateTime now = LocalDateTime.now();
String formatted = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalDate parsed = LocalDate.parse("2024-01-15");
Period period = Period.between(startDate, endDate); // 精確計算年月日差
java.time 包SimpleDateFormat 實例java.sql.Timestamp 或 JPA 的 @Temporal