【问题标题】:XMLGregorianCalendar not displayed in the right format when marshalled编组时 XMLGregorianCalendar 未以正确的格式显示
【发布时间】:2023-04-02 19:51:01
【问题描述】:

我从数据库中获取一些日期,将它们放入使用 JAXB 从 XSD 模式派生的类的对象中,然后将这些对象编组为 XML 文件。

其中一个派生类有一个 XMLGregorianCalendar 字段,我希望将放在那里的日期以“yyyy-MM-dd'T'HH:mm:ss”格式写入 XML 文件。

按照this 问题答案中的说明操作并不能解决我的问题。这就是我正在做的:

String formattedDate = sdf.format(dateFromTheDatabase);
        gc1 = convertStringToXmlGregorian(formattedDate);
        gc1.setTimezone(60);
components.setDate(gc1);

我正在使用的功能(或多或少从上述链接问题的答案中复制):

public XMLGregorianCalendar convertStringToXmlGregorian(String dateString)     throws DatatypeConfigurationException
{
    try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
            java.util.Date date = sdf.parse(dateString);
            GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();
            gc.setTime(date);
            return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        } 
}

编组填充的对象时在 XML 中获得的日期:

2015-06-03+01:00

...而我希望我的日期采用这种格式:

2015-06-03T00:00:00

我也尝试过的事情:

  • 更换
    "yyyy-MM-dd HH:mm:ss"

    "yyyy-MM-dd'T'HH:mm:ss"

  • 替换

        DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);    
    

        DatatypeFactory.newInstance().newXMLGregorianCalendar(
        gc.get(Calendar.YEAR), gc.get(Calendar.MONTH) + 1, gc.get(Calendar.DAY_OF_MONTH),
        gc.get(Calendar.HOUR_OF_DAY), 0,0,0,60);
    

【问题讨论】:

  • 在 JAXB 中的某个地方,您需要使用注释 @XmlSchemaType(name="dateTime") 设置正确的数据类型。可能您只设置了“日期”而不是“日期时间”。
  • 您的 components.date 属性的类型应为 DateCalendar。 JAXB 规范声明这些类型会自动映射到模式 dateTime 类型,其 lexical format 已经与您想要的匹配。根本不需要使用 DateFormats。
  • @Meno Hochschild:你是对的。请把它写成答案,以便我接受。

标签: java xml date jaxb marshalling


【解决方案1】:

好的,现在我的评论作为答案:

在 JAXB 中的某个地方(您尚未显示相关的 Java 文件),您需要使用注解 @XmlSchemaType(name="dateTime") 设置正确的数据类型。可能您只设置了“日期”而不是“日期时间”,因此您的 XMLGregorianCalendar-object 的时间部分已被 JAXB 层抑制。

另一个建议:

到目前为止,您所展示的部分似乎是双重工作 - 关于SimpleDateFormat 的使用。如果您的输入已经是 java.util.Date 类型的对象,那么您不需要再次格式化和解析它。只需将其作为参数传递给 GregorianCalendar.setTime()-method。

【讨论】:

    猜你喜欢
    • 2020-03-30
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    相关资源
    最近更新 更多