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

Java 日期時間工具類 DateUtil:字符串互轉、格式轉換、線程安全最佳實踐

     編輯:Java 綜合教學

DateUtil 核心功能

  • strToDate(String, pattern):字符串 → Date
  • dateToStr(Date, pattern):Date → 字符串
  • strToStr(String, srcPattern, tarPattern):字符串格式轉換(如 yyyy-MM-dd → yyyyMMdd)

完整代碼(已修復線程安全問題)

package pers.kangxu.datautils.utils;

import pers.kangxu.datautils.common.exception.DefineException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

    /** 字符串 → Date */
    public static Date strToDate(String strDate, String pattern) {
        try {
            return new SimpleDateFormat(pattern).parse(strDate);
        } catch (ParseException e) {
            throw new DefineException("日期解析失敗: " + strDate + " pattern=" + pattern, e);
        }
    }

    /** Date → 字符串 */
    public static String dateToStr(Date date, String pattern) {
        if (date == null) return "";
        return new SimpleDateFormat(pattern).format(date);
    }

    /** 字符串格式轉換 */
    public static String strToStr(String strDate, String srcPattern, String tarPattern) {
        try {
            Date date = new SimpleDateFormat(srcPattern).parse(strDate);
            return new SimpleDateFormat(tarPattern).format(date);
        } catch (ParseException e) {
            throw new DefineException("日期格式轉換失敗: " + strDate, e);
        }
    }
}

關鍵點:為什麼每次 new SimpleDateFormat?

SimpleDateFormat 非線程安全!併發環境下共享實例會導致解析錯誤、數據錯亂甚至拋出 NumberFormatException。每次調用創建新實例是最簡單、最安全的做法,現代 JVM 對短命物件分配優化極好,性能影響可忽略。

測試用例

public class DateUtilTester {
    public static void main(String[] args) {
        System.out.println(DateUtil.dateToStr(new Date(), "yyyy-MM-dd HH:mm:ss"));
        // 2024-01-15 14:30:45

        System.out.println(DateUtil.strToStr("2011-1-1 1:1:1", "yyyy-M-d H:m:s", "yyyyMMddHHmmss"));
        // 20110101010101

        System.out.println(DateUtil.strToDate("2011-1-1 1:1:1", "yyyy-M-d H:m:s"));
        // Sat Jan 01 01:01:01 CST 2011
    }
}

現代化替代方案:Java 8+ java.time

新項目強烈建議直接使用 java.time 包(LocalDateTime、DateTimeFormatter),天然線程安全、API 更豐富、時區處理更正確:

// Java 8 風格
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
String str = now.format(fmt); // 格式化
LocalDateTime parsed = LocalDateTime.parse("2024-01-15 14:30:45", fmt); // 解析

// 線程安全,可靜態常量復用
private static final DateTimeFormatter COMMON_FMT = DateTimeFormatter.ofPattern("yyyyMMdd");

避坑清單

  • yyyy vs YYYY:yyyy 是年份,YYYY 是週年,跨年週會導致年份錯誤(如 2023-12-31 解析為 2024)。
  • mm vs MM:mm 分鐘,MM 月份。
  • 時區:Date 無時區概念,SimpleDateFormat 默認用系統時區,跨時區傳輸必須指定 setTimeZone 或改用 ZonedDateTime。
  • 異常處理:捕獲 ParseException 並拋出業務異常,勿 printStackTrace() 吞掉。

總結

老項目維護用 DateUtil 封裝 SimpleDateFormat(每次 new 保證線程安全);新項目直接擁抱 java.time。這個工具類簡潔、無依賴、開箱即用,放入項目 common-utils 模塊即可。

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