You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:前端传入的Date对象转dd/MM/yyyy格式Date对象报错解决

问题分析与解决方案

核心问题

你的代码抛出ParseException的根本原因是逻辑错误:
你先把Date对象格式化为EEE MMM dd HH:mm:ss z yyyy格式的字符串(比如Mon Dec 26 12:43:19 SGT 2022),然后试图用dd/MM/yyyy格式的解析器去解析这个字符串——两种格式完全不匹配,必然报错。

另外你存在一个概念误解:Java的Date对象本身没有格式,它只是一个代表时间戳的对象,格式是日期字符串的属性,不是Date对象的属性。你需要的要么是将前端传来的日期解析为Date对象(用于存数据库),要么是将Date对象格式化为dd/MM/yyyy的字符串(用于展示)。

解决方案

方案一:修复旧API代码(不推荐,仅兼容老项目)

如果你的项目仍在使用SimpleDateFormat和Date:

情况1:后端已接收到Date对象

直接将Date对象格式化为目标字符串即可,无需多余的解析步骤:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
// 得到dd/MM/yyyy格式的字符串
String formattedDateStr = dateFormat.format(dateFromFrontend);

// 存数据库直接使用dateFromFrontend对象即可,不需要转换

情况2:后端接收的是前端传来的日期字符串

先将字符串解析为Date对象,再按需格式化:

// 定义前端日期字符串的解析格式
SimpleDateFormat inputSdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
// 解析字符串为Date对象
Date date = inputSdf.parse(dateStrFromFrontend);

// 格式化为dd/MM/yyyy的字符串
SimpleDateFormat outputSdf = new SimpleDateFormat("dd/MM/yyyy");
String formattedDateStr = outputSdf.format(date);

// 存数据库直接使用date对象

方案二:使用Java 8+新日期API(推荐)

SimpleDateFormat和Date是过时API,存在线程不安全、时区处理弱等问题,推荐使用java.time包下的新API:

// 假设前端传来的日期字符串为
String dateStr = "Mon Dec 26 12:43:19 SGT 2022";

// 定义输入格式的解析器(指定英文Locale避免月份/星期解析错误)
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
// 解析为带时区的日期对象
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, inputFormatter);

// 提取日期部分(仅保留年月日)
LocalDate localDate = zonedDateTime.toLocalDate();

// 格式化为dd/MM/yyyy的字符串
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String formattedDateStr = localDate.format(outputFormatter);

// 存数据库:
// 如果字段是DATE类型,直接传入localDate;
// 如果是TIMESTAMP类型,可转成Instant:zonedDateTime.toInstant()

内容的提问来源于stack exchange,提问作者Foody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:45:31