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
相关产品推荐
相关产品推荐

