Java日期格式化之IllegalArgumentException與MySQL數據截斷問題解決
引言
在Java開發(fā)中,日期時間處理和數據庫字段映射是常見的任務,但也容易遇到各種問題,例如:
IllegalArgumentException: Cannot format given Object as a Date(日期格式化失?。?/li>- MySQL
Data truncated for column(數據截斷錯誤)
本文將通過實際案例,分析這些問題的根本原因,并提供最佳實踐解決方案,涵蓋:
- Java日期時間格式化問題(
LocalDateTimevsDate) - MySQL字段長度與數據截斷問題
- 代碼優(yōu)化與統一處理方案
一、Java日期格式化問題:IllegalArgumentException
1.1 問題現象
在導出Excel時,以下代碼拋出異常:
row.createCell(15).setCellValue(
order.getProcessTime() != null ?
dateFormat.format(order.getProcessTime()) :
""
);
報錯信息:
java.lang.IllegalArgumentException: Cannot format given Object as a Date
原因是 order.getProcessTime() 返回的是 LocalDateTime,但 dateFormat(SimpleDateFormat)只能處理 java.util.Date 類型。
1.2 根本原因
SimpleDateFormat僅支持Date類型,不能直接格式化LocalDateTime、Timestamp等。- Java 8+ 推薦使用
java.time包(如LocalDateTime),但舊代碼可能仍依賴Date。
1.3 解決方案
方案1:轉換為Date再格式化(兼容舊代碼)
if (order.getProcessTime() != null) {
Date date = Date.from(
order.getProcessTime().atZone(ZoneId.systemDefault()).toInstant()
);
row.createCell(15).setCellValue(dateFormat.format(date));
} else {
row.createCell(15).setCellValue("");
}
方案2:直接使用DateTimeFormatter(推薦)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
row.createCell(15).setCellValue(
order.getProcessTime() != null ?
order.getProcessTime().format(formatter) :
""
);
方案3:提取工具類(統一處理)
public class DateUtils {
private static final DateTimeFormatter DEFAULT_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String format(LocalDateTime dateTime) {
return dateTime != null ? dateTime.format(DEFAULT_FORMATTER) : "";
}
}
// 調用
row.createCell(15).setCellValue(DateUtils.format(order.getProcessTime()));
二、MySQL數據截斷問題:Data truncated for column
2.1 問題現象
插入數據時報錯:
(pymysql.err.DataError) (1265, "Data truncated for column 'match_status' at row 1")
SQL日志:
INSERT INTO customer_order (..., match_status, ...) VALUES (..., '待匹配', ...)
原因是 match_status 列的長度不足以存儲 "待匹配"(3個字符)。
2.2 根本原因
MySQL字段定義可能是 VARCHAR(2) 或 ENUM,但插入了更長的值。
例如:
VARCHAR(2)無法存儲"待匹配"(3字符)。ENUM('匹配', '不匹配')無法接受"待匹配"。
2.3 解決方案
步驟1:檢查表結構
DESCRIBE customer_order;
重點關注 match_status 的類型:
如果是 VARCHAR(2),需要擴展長度:
ALTER TABLE customer_order MODIFY COLUMN match_status VARCHAR(10);
如果是 ENUM,需要添加選項:
ALTER TABLE customer_order MODIFY COLUMN match_status ENUM('匹配', '待匹配', '不匹配');
步驟2:驗證數據長度
在Java代碼中檢查字段長度:
if (order.getMatchStatus().length() > 10) {
throw new IllegalArgumentException("match_status 超出長度限制");
}
步驟3:統一處理(推薦)
public class DbUtils {
public static void validateOrder(CustomerOrder order) {
if (order.getMatchStatus() != null && order.getMatchStatus().length() > 10) {
throw new IllegalArgumentException("match_status 超出長度限制");
}
}
}
// 調用
DbUtils.validateOrder(order);
db.insert(order);
三、完整優(yōu)化代碼示例
3.1 日期時間格式化工具類
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public final class DateUtils {
private static final DateTimeFormatter DEFAULT_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String format(LocalDateTime dateTime) {
return dateTime != null ? dateTime.format(DEFAULT_FORMATTER) : "";
}
}
3.2 數據庫字段校驗工具類
public final class DbUtils {
public static void validateOrder(CustomerOrder order) {
// 檢查 match_status 長度
if (order.getMatchStatus() != null && order.getMatchStatus().length() > 10) {
throw new IllegalArgumentException("match_status 超出長度限制");
}
// 其他字段校驗...
}
}
3.3 統一調用示例
// 1. 校驗數據 DbUtils.validateOrder(order); // 2. 格式化日期 row.createCell(15).setCellValue(DateUtils.format(order.getProcessTime())); row.createCell(16).setCellValue(DateUtils.format(order.getCreateTime())); row.createCell(17).setCellValue(DateUtils.format(order.getUpdateTime())); // 3. 插入數據庫 db.insert(order);
四、總結與最佳實踐
4.1 日期時間處理
- 避免使用
SimpleDateFormat:線程不安全且僅支持Date。 - 推薦
DateTimeFormatter:支持LocalDateTime,線程安全。 - 提取工具類:統一格式化邏輯。
4.2 MySQL字段設計
- 提前規(guī)劃字段長度:例如
VARCHAR(10)比VARCHAR(2)更靈活。 - 使用
ENUM約束取值:避免非法數據。 - 代碼校驗數據長度:提前攔截問題。
4.3 統一處理原則
- 減少重復代碼:通過工具類復用邏輯。
- 提前校驗:在插入數據庫前檢查數據合法性。
通過以上優(yōu)化,可以徹底解決日期格式化和數據截斷問題,提升代碼健壯性!
到此這篇關于Java日期格式化之IllegalArgumentException與MySQL數據截斷問題解決的文章就介紹到這了,更多相關Java日期格式化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IDEA使用maven創(chuàng)建hibernate項目的實現步驟(圖文)
本文主要介紹了IDEA使用maven創(chuàng)建hibernate項目的實現步驟,包括創(chuàng)建Maven項目,配置Hibernate,以及創(chuàng)建實體類映射到數據庫等步驟,具有一定的參考價值,感興趣的可以了解一下2023-08-08
解決springboot啟動時報錯的問題ApplicationEventMulticaster not&nbs
這篇文章主要介紹了解決springboot啟動時報錯的問題ApplicationEventMulticaster not initialized,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06

