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

Java 8解析特定日期字符串时遭遇DateTimeParseException问题排查

问题分析与解决

核心错误原因

  1. 大小写不匹配导致索引3解析失败
    输入字符串中的月份是大写FEB,但默认DateTimeFormatter的MMM模式对Locale.ENGLISH期望的是首字母大写的标准缩写(如Feb),未开启大小写不敏感解析时会直接匹配失败。

  2. 重复定义模式导致索引32解析失败
    你使用DateTimeFormatterBuilder时,先通过appendPattern添加了完整格式,之后又重复追加" a z",导致格式化器期望输入中包含两次AM/PM与时区信息,而原字符串仅存在一次,因此在末尾位置匹配失败。

修正后的代码

String dateTimeInput = "01-FEB-25 12.00.00.000000 AM UTC";
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
        .parseCaseInsensitive() // 处理大写月份缩写
        .appendPattern("dd-MMM-yy hh.mm.ss.SSSSSS a z")
        // 可选:明确两位年份的解析基准,避免歧义(确保25解析为2025而非1925)
        .parseDefaulting(ChronoField.YEAR_OF_ERA, 2000)
        .toFormatter(Locale.ENGLISH);

ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTimeInput, inputFormatter);
System.out.println(zonedDateTime); // 输出:2025-02-01T00:00Z[UTC]

关键说明

  • parseCaseInsensitive():必须启用,才能兼容输入中的大写月份缩写。
  • 避免重复模式:确保格式化器的模式与输入字符串的结构完全对应,不要重复定义同一部分格式。
  • 年份解析优化:两位年份yy默认会基于当前时间推断范围,通过parseDefaulting可以固定基准年份,避免跨世纪的解析歧义。

转换为Oracle SQL兼容格式

如果需要将解析结果转换为Oracle可识别的格式(如TIMESTAMP WITH TIME ZONE),可以使用以下方式:

String oracleCompatibleDateTime = zonedDateTime.format(
        DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
);
// 输出示例:2025-02-01T00:00:00.000+00:00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:52:36