You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java日期转换报错:如何将Apr 1 2022 12:00:00:000AM转为yyyyMMdd?

解决Java解析Apr 1 2022 12:00:00:000AM日期字符串的异常问题

你遇到的DateTimeParseException主要是两个核心原因:日期字符串中日部分前的两个空格未匹配,以及缺少英文Locale导致月份缩写无法识别。以下是可行的解决方案:

问题根源拆解

  1. 输入字符串里Apr与1之间是两个空格,默认格式模式MMM d仅匹配单个空格,直接导致格式不匹配。
  2. Apr是英文月份缩写,若系统默认Locale非英文,解析器无法识别该月份,触发异常。
  3. 带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:13:20