字符串转Date遇Unparsable Date Error,如何转回yyyy-MM-dd格式Date?
解决方法:将
yyyy-MM-dd格式字符串转回Date类型 首先得帮你理清一个关键误区:Date类型本身没有格式,它本质上只是一个表示时间戳的对象(记录从1970年1月1日00:00:00 UTC以来的毫秒数)。你看到的Thu May 24 13:14:41 BRT 2018只是Date对象默认的toString()输出格式,并不是它存储的格式。你的需求应该是:把dataFormatada(yyyy-MM-dd格式的字符串)解析成Date对象,之后如果需要以yyyy-MM-dd的形式展示,再重新格式化即可。
你之前的代码报错,是因为你用yyyy-MM-dd的格式去解析一个包含星期、时分秒、时区的完整日期字符串(Thu Sep 28 20:29:30 JST 2000),格式完全不匹配,自然会抛出ParseException。你要解析的是dataFormatada,不是原始data变量的字符串形式。
正确的代码实现(使用SimpleDateFormat)
// 假设dataFormatada是你已经格式化好的yyyy-MM-dd字符串,比如"2018-05-24" String dataFormatada = "2018-05-24"; // 创建对应格式的DateFormat,指定Locale避免地区差异导致的解析错误 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); // 开启严格解析模式,避免解析不规范的日期(比如"2018-13-01"这种无效日期) dateFormat.setLenient(false); try { // 解析字符串得到Date对象 Date parsedDate = dateFormat.parse(dataFormatada); // 注意:这里打印的是Date的默认toString格式,比如"Thu May 24 00:00:00 BRT 2018" System.out.println(parsedDate); // 如果需要再次转成yyyy-MM-dd格式的字符串,直接用同一个DateFormat格式化即可 String formattedString = dateFormat.format(parsedDate); System.out.println(formattedString); // 输出:2018-05-24 } catch (ParseException e) { // 处理解析失败的情况,比如字符串格式不正确 e.printStackTrace(); }
更推荐的Java 8+新日期API
如果你使用的是Java 8及以上版本,强烈建议使用java.time包下的新日期时间API,它不仅线程安全,而且设计更清晰:
String dataFormatada = "2018-05-24"; // 解析成LocalDate(只包含日期,没有时间和时区) LocalDate localDate = LocalDate.parse(dataFormatada); // 如果需要兼容旧代码,转成Date对象 Date parsedDate = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); // 转回yyyy-MM-dd格式的字符串 String formattedString = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); System.out.println(formattedString); // 输出:2018-05-24
关键提醒
- 永远确保解析时使用的格式字符串和待解析的字符串格式完全匹配,这是避免
ParseException的核心。 - Date对象本身不存储格式,所有的格式都是通过格式化工具(比如
SimpleDateFormat、DateTimeFormatter)生成的字符串形式。
内容的提问来源于stack exchange,提问作者Pelicer
相关产品推荐
相关产品推荐

