为何相似时间输入下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
相关产品推荐
相关产品推荐

