strToDate(String, pattern):字符串 → DatedateToStr(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);
}
}
}
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.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 是年份,YYYY 是週年,跨年週會導致年份錯誤(如 2023-12-31 解析為 2024)。mm 分鐘,MM 月份。Date 無時區概念,SimpleDateFormat 默認用系統時區,跨時區傳輸必須指定 setTimeZone 或改用 ZonedDateTime。ParseException 並拋出業務異常,勿 printStackTrace() 吞掉。老項目維護用 DateUtil 封裝 SimpleDateFormat(每次 new 保證線程安全);新項目直接擁抱 java.time。這個工具類簡潔、無依賴、開箱即用,放入項目 common-utils 模塊即可。