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
相关产品推荐
相关产品推荐

