将字符串日期转为java.util.Date时遇ParseException问题求助
解决Java日期转换的ParseException问题
嘿,这个问题我碰到过好多次啦!咱们先搞清楚为啥会抛ParseException,再给你两种靠谱的解决方案~
问题根源
你输入的日期字符串是"04/18/2018 12:00 AM",但你用的SimpleDateFormat模式是"dd-MMM-yyyy,HH:mm:ss aaa"——这俩格式完全不匹配,解析器根本认不出你的输入,自然就报错了!
解决方案一:用旧版SimpleDateFormat修复
要分两步走:先用和输入匹配的模式解析字符串,再用你想要的模式格式化输出。
修正后的代码
private Date convertToDate(String date) { try { // 第一步:匹配输入格式的解析器(MM是月份,dd是日期,hh是12小时制小时) DateFormat dateParser = new SimpleDateFormat("MM/dd/yyyy hh:mm a"); Date parsedDate = dateParser.parse(date); // 第二步:格式化你需要的输出格式 DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); String desiredFormattedDate = dateFormatter.format(parsedDate); System.out.println(desiredFormattedDate); // 输出示例:2018-04-18 12:00:00 AM return parsedDate; } catch (ParseException e) { e.printStackTrace(); } return null; }
注意事项
SimpleDateFormat是非线程安全的,千万别在多线程环境下共享同一个实例哦!要么每次使用都新建,要么用ThreadLocal来包装它。
解决方案二:推荐用Java 8+的新日期API
从Java 8开始,官方推出了更安全、更易用的日期时间API(java.time包),完全替代了老旧的Date和SimpleDateFormat,再也不用担心线程安全问题啦!
示例代码
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; private LocalDateTime convertToLocalDateTime(String date) { try { // 定义输入格式的解析器 DateTimeFormatter inputParser = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a"); LocalDateTime dateTime = LocalDateTime.parse(date, inputParser); // 定义输出格式的格式化器 DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a"); String desiredFormattedDate = dateTime.format(outputFormatter); System.out.println(desiredFormattedDate); // 输出示例:2018-04-18 12:00:00 AM return dateTime; } catch (DateTimeParseException e) { e.printStackTrace(); return null; } }
这个API不仅线程安全,而且语义更清晰,能避免很多旧API的坑,非常推荐使用!
内容的提问来源于stack exchange,提问作者K Guru
相关产品推荐
相关产品推荐

