首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 字符串日期格式轉換:SimpleDateFormat 解析與格式化

     編輯:程式設計疑難解答

核心代碼


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")))

Java 8 線程安全寫法 (生產環境首選)


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) 嚴格校驗、捕獲異常。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved