最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java日期格式化之IllegalArgumentException與MySQL數(shù)據(jù)截斷問題解決

 更新時間:2025年07月07日 10:02:00   作者:碼農(nóng)阿豪@新空間  
在Java開發(fā)中,日期時間處理和數(shù)據(jù)庫字段映射是常見的任務,但也容易遇到各種問題,譬如IllegalArgumentException與MySQL數(shù)據(jù)截斷問題,下面我們就來看看他們的具體解決方法吧

引言

在Java開發(fā)中,日期時間處理和數(shù)據(jù)庫字段映射是常見的任務,但也容易遇到各種問題,例如:

  • IllegalArgumentException: Cannot format given Object as a Date(日期格式化失?。?/li>
  • MySQL Data truncated for column(數(shù)據(jù)截斷錯誤)

本文將通過實際案例,分析這些問題的根本原因,并提供最佳實踐解決方案,涵蓋:

  • Java日期時間格式化問題(LocalDateTime vs Date
  • MySQL字段長度與數(shù)據(jù)截斷問題
  • 代碼優(yōu)化與統(tǒng)一處理方案

一、Java日期格式化問題:IllegalArgumentException

1.1 問題現(xiàn)象

在導出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,但 dateFormatSimpleDateFormat)只能處理 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:提取工具類(統(tǒng)一處理)

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數(shù)據(jù)截斷問題:Data truncated for column

2.1 問題現(xiàn)象

插入數(shù)據(jù)時報錯:

(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:驗證數(shù)據(jù)長度

在Java代碼中檢查字段長度:

if (order.getMatchStatus().length() > 10) {
    throw new IllegalArgumentException("match_status 超出長度限制");
}

步驟3:統(tǒng)一處理(推薦)

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 數(shù)據(jù)庫字段校驗工具類

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 統(tǒng)一調用示例

// 1. 校驗數(shù)據(jù)
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. 插入數(shù)據(jù)庫
db.insert(order);

四、總結與最佳實踐

4.1 日期時間處理

  • 避免使用 SimpleDateFormat:線程不安全且僅支持 Date。
  • 推薦 DateTimeFormatter:支持 LocalDateTime,線程安全。
  • 提取工具類:統(tǒng)一格式化邏輯。

4.2 MySQL字段設計

  • 提前規(guī)劃字段長度:例如 VARCHAR(10)VARCHAR(2) 更靈活。
  • 使用 ENUM 約束取值:避免非法數(shù)據(jù)。
  • 代碼校驗數(shù)據(jù)長度:提前攔截問題。

4.3 統(tǒng)一處理原則

  • 減少重復代碼:通過工具類復用邏輯。
  • 提前校驗:在插入數(shù)據(jù)庫前檢查數(shù)據(jù)合法性。

通過以上優(yōu)化,可以徹底解決日期格式化和數(shù)據(jù)截斷問題,提升代碼健壯性!

到此這篇關于Java日期格式化之IllegalArgumentException與MySQL數(shù)據(jù)截斷問題解決的文章就介紹到這了,更多相關Java日期格式化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 利用Sharding-Jdbc組件實現(xiàn)分表

    利用Sharding-Jdbc組件實現(xiàn)分表

    這篇文章主要為大家詳細介紹了利用Sharding-Jdbc組件實現(xiàn)分表,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • IDEA插件推薦之Maven-Helper的教程圖解

    IDEA插件推薦之Maven-Helper的教程圖解

    這篇文章主要介紹了IDEA插件推薦之Maven-Helper的相關知識,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考
    2020-07-07
  • idea關聯(lián)maven的使用詳解

    idea關聯(lián)maven的使用詳解

    這篇文章主要介紹了idea關聯(lián)maven的使用詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 詳談Java 異常處理的誤區(qū)和經(jīng)驗總結(分享)

    詳談Java 異常處理的誤區(qū)和經(jīng)驗總結(分享)

    下面小編就為大家分享一篇Java 異常處理的誤區(qū)和經(jīng)驗總結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java中的自旋鎖與阻塞鎖詳解

    Java中的自旋鎖與阻塞鎖詳解

    這篇文章主要介紹了Java中的自旋鎖與阻塞鎖詳解,阻塞鎖是指當線程嘗試獲取鎖失敗時,線程進入阻塞狀態(tài),直到接收信號后被喚醒,阻塞或者喚醒一個Java線程需要操作系統(tǒng)切換CPU?狀態(tài)來完成,這種狀態(tài)轉換?需要耗費處理器時間,需要的朋友可以參考下
    2023-10-10
  • java實現(xiàn)mongodb的數(shù)據(jù)庫連接池

    java實現(xiàn)mongodb的數(shù)據(jù)庫連接池

    這篇文章主要介紹了基于java實現(xiàn)mongodb的數(shù)據(jù)庫連接池,Java通過使用mongo-2.7.3.jar包實現(xiàn)mongodb連接池,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 一文詳解Java中三大異常處理方式(try-catch、throw、throws)

    一文詳解Java中三大異常處理方式(try-catch、throw、throws)

    這篇文章主要介紹了Java中三大異常處理方式的相關資料,分別是try-catch、throw、throws,try-catch、throw、throws,try-catch用于捕獲和處理異常,throw用于顯式拋出異常,throws用于聲明方法可能拋出的異常,需要的朋友可以參考下
    2026-01-01
  • Java集合教程之Collection實例詳解

    Java集合教程之Collection實例詳解

    集合,或者叫容器,是一個包含多個元素的對象,下面這篇文章主要給大家介紹了關于Java集合教程之Collection的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-08-08
  • JavaWeb項目中DLL文件動態(tài)加載方法

    JavaWeb項目中DLL文件動態(tài)加載方法

    在JavaWeb項目中,有時候我們需要在運行時動態(tài)加載DLL文件(在Windows中是DLL,在Linux中是SO文件),這通常用于實現(xiàn)一些特定的功能,比如調用本機代碼或者使用某些特定于操作系統(tǒng)的API,本文將介紹如何在JavaWeb項目中動態(tài)加載DLL文件,需要的朋友可以參考下
    2024-12-12
  • springboot查詢全部部門流程分析

    springboot查詢全部部門流程分析

    本文分析了在SpringBoot框架中前端如何請求DeptController的list()方法,并通過DeptService到DeptMapper接口查詢數(shù)據(jù)庫中的全部部門信息的流程,整個過程涉及前端到后端數(shù)據(jù)的獲取和返回,是SpringBoot應用中常見的數(shù)據(jù)處理模式
    2024-10-10

最新評論

宁强县| 花垣县| 江达县| 镇沅| 甘洛县| 廉江市| 兴仁县| 仁怀市| 社旗县| 湖南省| 谢通门县| 萍乡市| 马关县| 高碑店市| 囊谦县| 屯留县| 汾阳市| 杭锦后旗| 瑞丽市| 新闻| 如皋市| 玉门市| 宁晋县| 城固县| 靖远县| 琼中| 通化县| 株洲市| 屏南县| 汶上县| 梁山县| 察雅县| 瓮安县| 厦门市| 江川县| 抚顺市| 永德县| 井陉县| 唐山市| 高安市| 万山特区|