Java日期转换报错:如何将Apr 1 2022 12:00:00:000AM转为yyyyMMdd?
解决Java解析
Apr 1 2022 12:00:00:000AM日期字符串的异常问题 你遇到的DateTimeParseException主要是两个核心原因:日期字符串中日部分前的两个空格未匹配,以及缺少英文Locale导致月份缩写无法识别。以下是可行的解决方案:
问题根源拆解
- 输入字符串里
Apr与1之间是两个空格,默认格式模式MMM d仅匹配单个空格,直接导致格式不匹配。 Apr是英文月份缩写,若系统默认Locale非英文,解析器无法识别该月份,触发异常。- 带AM/PM的12小时制时间必须用
hh模式,若误用24小时制的HH,12AM这类时间无法正确解析。
代码实现
下面的代码同时解决了空格匹配、Locale指定和时间格式问题,且兼容日前面1个或多个空格的场景:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class DateConverter { public static void main(String[] args) { String input = "Apr 1 2022 12:00:00:000AM"; // 解析器:匹配英文月份、1+空格、日、年、12小时制时间+毫秒+AM/PM DateTimeFormatter parser = DateTimeFormatter.ofPattern( "MMM[ ]+d yyyy hh:mm:ss:SSSa", Locale.ENGLISH ); // 解析为LocalDateTime对象 LocalDateTime dateTime = LocalDateTime.parse(input, parser); // 格式化为yyyyMMdd格式 String output = dateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd")); System.out.println(output); // 输出:20220401 } }
关键细节说明
[ ]+:模式中该部分表示匹配一个或多个空格,不管输入中日前面是1个还是多个空格都能正确解析,比硬写两个空格更通用。Locale.ENGLISH:强制指定英文Locale,避免系统默认Locale非英文时无法识别Apr这类英文月份缩写。hh:对应12小时制的小时,配合后面的a(AM/PM标识)才能正确解析12AM的时间。SSS:匹配毫秒部分的三位数字,与输入中的000完全对应。
后续排查要点
如果修改后仍报错,检查以下几点:
- 是否漏加
Locale.ENGLISH:这是最容易忽略的点,多数异常都源于Locale不匹配。 - 模式中的空格是否正确:若输入空格数量不确定,优先用
[ ]+代替固定数量的空格。 - 时间模式是否误用:带AM/PM的场景必须用
hh,24小时制才用HH。
内容的提问来源于stack exchange,提问作者PAA
相关产品推荐
相关产品推荐

