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

Java日期解析异常:AM/PM与a.m./p.m.格式适配故障

解决SimpleDateFormat解析a.m./p.m.格式时间的异常问题

问题分析

你遇到的ParseException根源在于:SimpleDateFormat默认依赖系统Locale的上午/下午标识符(比如英文环境下的AM/PM),但你的设备返回的时间格式是a.m./p.m.,和默认标识符不匹配,导致解析失败。而设备返回AM/PM时能正常运行,正是因为和默认规则一致。

解决方案

这里提供两种可行方案,优先推荐Java 8+的新日期时间API,它更安全、功能更完善:

方法1:自定义DateFormatSymbols适配a.m./p.m.格式

如果仍需使用SimpleDateFormat,可以通过自定义DateFormatSymbols替换默认的上午/下午标记:

String strDate = "01/20/2018 12:15 p.m."; // 设备返回的a.m./p.m.格式时间
SimpleDateFormat dateF = new SimpleDateFormat("MM/dd/yyyy hh:mm a", Locale.ENGLISH);

// 自定义标识符,适配设备的a.m./p.m.格式
DateFormatSymbols symbols = new DateFormatSymbols();
symbols.setAmPmStrings(new String[]{"a.m.", "p.m."});
dateF.setDateFormatSymbols(symbols);

try {
    Date date = dateF.parse(strDate);
    String convertDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(date);
    tickets.TimeDue = convertDate;
} catch (ParseException e) {
    e.printStackTrace();
}

方法2:使用Java 8+的java.time API(推荐)

SimpleDateFormat是线程不安全的过时类,java.time包提供了更可靠的处理方式,我们可以自定义DateTimeFormatter适配格式:

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

String strDate = "01/20/2018 12:15 p.m.";
// 定义适配a.m./p.m.的格式器,指定Locale确保解析行为一致
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.ENGLISH);

// 可选:统一格式,兼容设备返回的A.M./P.M.或am/pm等变体
strDate = strDate.replace(".", "").toLowerCase();

LocalDateTime dateTime = LocalDateTime.parse(strDate, inputFormatter);
String convertDate = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
tickets.TimeDue = convertDate;

关键注意点

  • Locale一致性:不同Locale的上午/下午标识符可能不同,指定明确的Locale可以避免系统环境差异引发的问题。
  • 格式兼容性:部分设备可能返回A.M./P.M.或不带点号的am/pm,可以先对输入字符串做统一处理(比如去除点号、转小写)来提升兼容性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:45:40