
ParseException 通常是因为日期字符串格式和解析器期望的格式不匹配,排查重点在格式一致性、时区、语言环境和异常堆栈信息。
检查 SimpleDateFormat 的 pattern 是否匹配字符串
这是最常见的原因。SimpleDateFormat 的 pattern 必须与待解析字符串的结构完全一致,包括分隔符、位数、年份是 yy 还是 yyyy、月份是 M 还是 MM 等。
- 比如字符串是 "2023-05-12",pattern 应为 "yyyy-MM-dd";若写成 "yyyy/MM/dd" 或 "yyyy-MM-d"(少一个 d)就会抛 ParseException
- 注意:字母大小写敏感 —— "mm" 是分钟,"MM" 才是月份;"hh" 是12小时制,"HH" 是24小时制
- 建议用
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2023-05-12 14:30:45")这样一一对照验证
确认字符串中没有隐藏字符或空格
肉眼不可见的字符(如全角空格、BOM、换行符)常导致解析失败,尤其从文件、HTTP 响应或用户输入读取时。
- 打印字符串的每个字符 Unicode 编码:
str.chars().forEach(c -> System.out.printf("U+%04X ", c)); - 使用
str.trim()清除首尾空白;对中间空格敏感的场景,可先用str.replace(" ", "").replace("\u00A0", "")处理全角/不间断空格 - 如果字符串来自 JSON,检查是否被自动转义或包裹了引号(例如实际传入的是 "\"2023-05-12\"")
留意 Locale 和 TimeZone 设置
SimpleDateFormat 默认使用 JVM 当前 Locale 和 TimeZone,但字符串若含英文月份/星期(如 "Jan"、"Monday"),或有时区偏移(如 "GMT+0800"),就必须显式指定。
- 解析 "12-May-2023" 时,pattern 为 "dd-MMM-yyyy",但必须搭配 Locale.ENGLISH,否则中文环境可能无法识别 "May"
- 含时区的字符串如 "2023-05-12T14:30:45+08:00",推荐改用 java.time 类(如
ZonedDateTime.parse()),SimpleDateFormat 对 ISO 8601 支持有限且易出错 - 避免依赖默认时区:显式设置
sdf.setTimeZone(TimeZone.getTimeZone("GMT"))可减少环境差异影响
优先使用 java.time 替代 SimpleDateFormat
SimpleDateFormat 不是线程安全的,且错误提示模糊;java.time(Java 8+)更清晰、健壮,异常信息也更具体。
- 用
LocalDateTime.parse(str, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))替代旧 API - 遇到异常时,
DateTimeParseException的getMessage()会明确指出“Text '2023-05-12x' could not be parsed at index 10”,比 ParseException 更易定位 - 对标准格式(如 ISO_LOCAL_DATE),直接用预定义格式器:
LocalDate.parse("2023-05-12")无需手动指定 pattern
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











