首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 日期與字串互轉完全指南:SimpleDateFormat 模式、執行緒安全與最佳實踐

     編輯:Java 相關知識

`SimpleDateFormat` 是 Java 日期格式化與解析核心工具,掌握模式字母大小寫差異、執行緒不安全特性與現代替代方案,避免生產環境Bug。

核心模式字母對照表

字母含義範例注意
y年2024 / 24yyyy=完整年,yy=兩位年
M月07 / Jul / JulyMM=兩位數,MMM=縮寫,MMMM=全名
d日10
H時 (24制)190-23
h時 (12制)071-12,需搭配 a (AM/PM)
m分20小寫 m!
s秒00
S毫秒123
aAM/PMPM
Z時區偏移+0800

大小寫極其重要:`MM`=月,`mm`=分;`HH`=24制,`hh`=12制。

基本用法範例

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// 字串 → Date
String str = "2024-07-10 19:20:00";
Date date = sdf.parse(str);

// Date → 字串
String formatted = sdf.format(new Date());
// 輸出: 2024-07-10 19:20:00

// 自訂格式
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println(sdf2.format(new Date()));
// 輸出: 2024年07月10日

完整工具類範例

import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateConvertUtil {
  private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
  
  public static String dateToStr(Date date) {
    return dateToStr(date, DEFAULT_PATTERN);
  }
  
  public static String dateToStr(Date date, String pattern) {
    if (date == null) return null;
    return new SimpleDateFormat(pattern).format(date);
  }
  
  public static Date strToDate(String str) {
    return strToDate(str, DEFAULT_PATTERN);
  }
  
  public static Date strToDate(String str, String pattern) {
    if (str == null || str.trim().isEmpty()) return null;
    try {
      return new SimpleDateFormat(pattern).parse(str);
    } catch (ParseException e) {
      throw new IllegalArgumentException("日期解析失敗: " + str, e);
    }
  }
  
  public static void main(String[] args) {
    Date now = new Date();
    System.out.println("日期轉字串: " + dateToStr(now));
    System.out.println("字串轉日期: " + strToDate(dateToStr(now)));
  }
}

⚠️ 重大陷阱:SimpleDateFormat 非執行緒安全

錯誤做法:靜態共享實例

// 危險!多執行緒併發會導致解析錯誤、數據竄改
public static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");

正確做法三選一:

  1. 方法區域新建:每次使用 `new SimpleDateFormat(pattern)` (效能可接受)
  2. ThreadLocal 快取:
    private static final ThreadLocal SDF_THREAD_LOCAL = 
      ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
  3. Java 8+ 使用 `DateTimeFormatter` (不可變、執行緒安全):
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate date = LocalDate.parse(str, fmt);
    String out = date.format(fmt);

Java 8 新時代:java.time 套件全面取代

舊類別新替代優勢
DateInstant / LocalDate / LocalDateTime不可變、領域清晰
CalendarZonedDateTime時區處理正確
SimpleDateFormatDateTimeFormatter執行緒安全、效能更好

新專案強烈建議直接使用 `java.time`,舊專案逐步遷移。

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