SimpleDateFormat格式化XMLGregorianCalendar时MM-dd-yyyy报错如何解决
错误根因
DatatypeFactory.newXMLGregorianCalendar(String lexicalRepresentation) 方法对入参字符串的格式有强制要求,必须符合W3C XML Schema的日期规范,仅支持yyyy-MM-dd这类标准顺序的格式。你传入MM-dd-yyyy格式的字符串时,解析器会将前两位识别为年份,后续格式匹配失败,因此抛出IllegalArgumentException异常。
正确实现方案
你的需求本质是先将Date转为XMLGregorianCalendar对象,再将该对象格式化为MM-dd-yyyy格式的字符串,分两步实现即可:
步骤1:Date转XMLGregorianCalendar(无需绕字符串格式化,更稳定)
public static XMLGregorianCalendar convertToXMLGregorianCalendar(Date date) { try { GregorianCalendar gregorianCalendar = new GregorianCalendar(); gregorianCalendar.setTime(date); return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar); } catch (DatatypeConfigurationException e) { e.printStackTrace(); } return null; }
步骤2:将XMLGregorianCalendar格式化为MM-dd-yyyy字符串
public static String formatAsMmDdYyyy(XMLGregorianCalendar xmlCalendar) { if (xmlCalendar == null) { return null; } // 转换为Date对象后再做自定义格式化 Date date = xmlCalendar.toGregorianCalendar().getTime(); DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy"); // 如果需要固定时区可以加以下配置 // dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8")); return dateFormat.format(date); }
调用示例
public static void main(String[] args) { XMLGregorianCalendar xmlCalendar = convertToXMLGregorianCalendar(new Date()); String result = formatAsMmDdYyyy(xmlCalendar); // 输出示例:08-05-2021 System.out.println(result); }
可选优化:Java 8及以上版本推荐使用线程安全的
DateTimeFormatter替代SimpleDateFormat,示例如下:private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("MM-dd-yyyy"); public static String formatAsMmDdYyyy(XMLGregorianCalendar xmlCalendar) { if (xmlCalendar == null) { return null; } LocalDate localDate = xmlCalendar.toGregorianCalendar().toZonedDateTime().toLocalDate(); return localDate.format(FORMATTER); }
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

