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

为何相似时间输入下SimpleDateFormat解析抛出ParseException?

问题分析与解决

核心原因

你遇到的问题本质是两个字符串中的空格字符并非同一类型:

  • "05:20 AM" 里的空格是非断空格(Unicode码点U+202F),属于特殊空白字符;
  • "05:50 AM" 里的是普通空格(Unicode码点U+0020)。

SimpleDateFormat的hh:mm a格式规则严格要求使用普通空格分隔时间与AM/PM标识,因此遇到特殊空格时会触发解析失败。

验证方法

可以通过以下代码查看字符的Unicode码点,确认空格差异:

public class CheckSpace {
    public static void main(String[] args) {
        String s1 = "05:20 AM";
        String s2 = "05:50 AM";
        for (char c : s1.toCharArray()) {
            System.out.printf("%c: %04X%n", c, (int) c);
        }
        System.out.println("---");
        for (char c : s2.toCharArray()) {
            System.out.printf("%c: %04X%n", c, (int) c);
        }
    }
}

运行后会看到s1中的空格对应U+202F,s2中的空格对应U+0020。

解决办法

方法1:统一替换特殊空格

解析前将字符串中所有Unicode空白字符替换为普通空格:

String date_s = "05:20 AM".replaceAll("\\s", " ");

\\s正则会匹配所有空白类字符(包括普通空格、非断空格、制表符等)。

方法2:使用Java 8+新时间API(推荐)

SimpleDateFormat是线程不安全的老旧API,推荐使用DateTimeFormatter,它支持更灵活的解析规则:

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class FormatDateNew {
    public static void main(String[] args) {
        String date_s = "05:20 AM";
        // 匹配一个或多个任意空白字符
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm\\s+a", Locale.ENGLISH);
        LocalTime time = LocalTime.parse(date_s, formatter);
        System.out.println(time.format(formatter));
    }
}

也可以启用宽松解析模式,兼容更多格式差异:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)
        .withResolverStyle(ResolverStyle.LENIENT);

内容的提问来源于stack exchange,提问作者CodeGeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:52:40