Java字符串日期转指定格式失败,报ParseException异常求助
我来帮你搞定这个日期格式化的问题!你遇到的ParseException主要是两个核心原因:一是没有给SimpleDateFormat设置匹配输入字符串的格式模式,二是月份缩写Aug依赖英文Locale,如果你的程序默认Locale不是英文的话,也会导致解析失败。下面给你两种解决方案:
方法一:修复旧的SimpleDateFormat代码
你需要分别定义输入格式和输出格式的SimpleDateFormat实例,同时给输入格式指定英文Locale:
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class DateConverter { public static void main(String[] args) throws Exception { String input = "30 Aug 2019"; // 定义匹配输入的格式:dd(日)、MMM(英文月份缩写)、yyyy(年),同时指定英文Locale SimpleDateFormat inputFormatter = new SimpleDateFormat("dd MMM yyyy", Locale.ENGLISH); Date date = inputFormatter.parse(input); // 定义目标输出格式:yyyy-MM-dd SimpleDateFormat outputFormatter = new SimpleDateFormat("yyyy-MM-dd"); String strDate = outputFormatter.format(date); System.out.println(strDate); // 输出:2019-08-30 } }
方法二:推荐使用Java 8+的新日期API(更优)
SimpleDateFormat存在线程不安全、API设计不直观等问题,Java 8及以上版本提供的java.time包(JSR-310)是更好的选择,它的类都是不可变且线程安全的:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; public class LocalDateConverter { public static void main(String[] args) { String input = "30 Aug 2019"; // 定义输入格式,指定英文Locale DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH); LocalDate localDate = LocalDate.parse(input, inputFormatter); // 定义输出格式 DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String strDate = localDate.format(outputFormatter); System.out.println(strDate); // 输出:2019-08-30 } }
这个新API不仅更可靠,代码可读性也更高,建议优先使用。
内容的提问来源于stack exchange,提问作者Shashank




