public static String convertDateFormat(String input, String inputPattern, String outputPattern) {
if (input == null || input.trim().isEmpty()) return "";
try {
SimpleDateFormat inputFmt = new SimpleDateFormat(inputPattern);
inputFmt.setLenient(false); // 嚴格模式,拒絕 2023-02-30 等非法日期
Date date = inputFmt.parse(input);
SimpleDateFormat outputFmt = new SimpleDateFormat(outputPattern);
return outputFmt.format(date);
} catch (ParseException e) {
// 記錄日誌或拋出自定義異常
return ""; // 或 null
}
}
// 使用示例
String input = "2016-01-13 10:09:24";
String output = convertDateFormat(input, "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd");
// 結果: "2016/01/13"
| 項目 | 說明 |
|---|---|
| 線程安全 | SimpleDateFormat 非線程安全。多線程環境**不可**共用實例。 方案:方法內 new 實例 / ThreadLocal / 改用 Java 8 DateTimeFormatter (線程安全)。 |
| Lenient 模式 | 默認 lenient=true 會自動修正非法日期 (如 2023-02-30 → 2023-03-02)。**業務解析必須 setLenient(false)**。 |
| Pattern 字母大小寫 | yyyy 年、MM 月、dd 日、HH 24時、mm 分、ss 秒、SSS 毫秒。月份用大寫 MM,分鐘用小寫 mm。 |
| Java 8+ 推薦 | DateTimeFormatter 線程安全、不可變、API 更清晰:DateTimeFormatter.ofPattern("yyyy/MM/dd").format(LocalDateTime.parse(input, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) |
private static final DateTimeFormatter INPUT_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static final DateTimeFormatter OUTPUT_FMT = DateTimeFormatter.ofPattern("yyyy/MM/dd");
public static String convertDateFormatJava8(String input) {
if (input == null || input.isBlank()) return "";
try {
LocalDateTime ldt = LocalDateTime.parse(input, INPUT_FMT);
return OUTPUT_FMT.format(ldt);
} catch (DateTimeParseException e) {
return "";
}
}
new SimpleDateFormat("yyyy-mm-dd") → mm 是分鐘,**月份必須大寫 MM**。SimpleDateFormat 實例 → 多線程下解析錯誤/拋異常/數據竄改。ParseException 導致業務中斷。setLenient(false) 導致臟數據入庫。Java 字符串日期格式轉換核心:SimpleDateFormat.parse() 解析為 Date → SimpleDateFormat.format() 格式化為目標字符串。 **生產環境強制要求:方法內 new 實例 或 用 Java 8 DateTimeFormatter (線程安全)、setLenient(false) 嚴格校驗、捕獲異常。**