【问题标题】:changing XMLgregorianCalender default format to "yyyyMMdd"将 XMLgregorianCalender 默认格式更改为“yyyyMMdd”
【发布时间】:2017-06-02 13:35:25
【问题描述】:

需要助手,我需要将XMLGregorianCalendar 的默认格式(2017-01-18)更改为示例“20170118”,我在这里尝试了很多示例,但没有帮助

private static SimpleDateFormat formats = new SimpleDateFormat("yyyyMMdd");

public static XMLGregorianCalendar unmarshal(String value) {
    try {
        return toXMLGregorianCalendar(formats.parse(value));
    } catch ( ParseException e ) {
        e.printStackTrace();
        return null;
    }
}

【问题讨论】:

    标签: java jaxb gregorian-calendar xmlgregoriancalendar


    【解决方案1】:

    恐怕你做不到。如果您查看XMLGregorianCalendar 类,您会发现toString() 方法只是调用toXMLFormat(),而toXMLFormat() 不提供任何格式自定义的可能性。

    public String toXMLFormat() {
    
        QName typekind = getXMLSchemaType();
    
        String formatString = null;
        // Fix 4971612: invalid SCCS macro substitution in data string
        //   no %{alpha}% to avoid SCCS macro substitution
        if (typekind == DatatypeConstants.DATETIME) {
            formatString = "%Y-%M-%DT%h:%m:%s" + "%z";
        } else if (typekind == DatatypeConstants.DATE) {
            formatString = "%Y-%M-%D" + "%z";
        } else if (typekind == DatatypeConstants.TIME) {
            formatString = "%h:%m:%s" + "%z";
        } else if (typekind == DatatypeConstants.GMONTH) {
            formatString = "--%M" + "%z";
        } else if (typekind == DatatypeConstants.GDAY) {
            formatString = "---%D" + "%z";
        } else if (typekind == DatatypeConstants.GYEAR) {
            formatString = "%Y" + "%z";
        } else if (typekind == DatatypeConstants.GYEARMONTH) {
            formatString = "%Y-%M" + "%z";
        } else if (typekind == DatatypeConstants.GMONTHDAY) {
            formatString = "--%M-%D" + "%z";
        }
        return format(formatString);
    }
    

    有没有变通的解决方案?

    好吧,如果你只想从XMLGregorianCalendar 对象中获取yyyyMMdd 类型的字符串,你可以这样做:

    XMLGregorianCalendar c = YourCalendarHelper.unmarshal("2017-01-18");
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
    String str = format.format(c.toGregorianCalendar().getTime());
    
    System.out.println(str);  // 20170118
    

    顺便说一句,如果在转换过程中出现异常,除非您知道 100% 确定如何处理它,否则不要捕获它。通过方法声明抛出它,让这个方法的调用者知道潜在的失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多