【问题标题】:Java parsing XML date - exclude timeJava解析XML日期-排除时间
【发布时间】:2011-10-12 06:34:39
【问题描述】:

这是我第一次在 Java 中深入使用 XML。该代码使用 JAXB 生成类,然后进行解析。我有一个带有日期的 XML...

JAXB 从我的 XML 生成了一个类。它为该字段生成了以下内容:

@XmlElement(name = "CoverStartDate", required = true)
protected XMLGregorianCalendar coverStartDate;

在我的逻辑中,我有以下内容

xxxx.setCoverStartDate(xmlGregorianCalendar(theDate)

有一个方法 xmlGregorianCalendar 看起来像这样:

GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);

我生成的返回 XML 具有指定时间的日期。我只想要日期(年月日)。

有什么建议吗?

谢谢

【问题讨论】:

    标签: java parsing


    【解决方案1】:

    使用DatatypeFactory.newXMLGregorianCalendarDate(...) 而不是简单地使用任何DatatypeFactory.newXMLGregorianCalendar(...) 方法。

    我不知道您的代码 sn-p 中的 theDate 是什么,但是如果您正在使用 Date 对象,您可以使用以下内容。

      public static XMLGregorianCalendar setCoverStartDate(Date date) throws DatatypeConfigurationException {
        Calendar calendar = Calendar.getInstance();
        date.setTime(date.getTime());
        return DatatypeFactory.newInstance().newXMLGregorianCalendarDate(
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH) + 1,
            calendar.get(Calendar.DAY_OF_MONTH),
            getTimeZone(calendar));
      }
    
      public static int getTimeZone(Calendar calendar) {
        return (int) TimeUnit.MINUTES.convert(calendar.get(Calendar.ZONE_OFFSET), TimeUnit.MILLISECONDS);
      }
    

    (注意calendar's Calendar.ZONE_OFFSET 以毫秒为单位,newXMLGregorianCalendarDate(...) 方法需要以分钟为单位的时区值,因此需要对其进行转换。)

    (另请注意,Calendar's 月份索引是从 0 开始的,而 XMLGregorianCalendar's 月份是从 1 开始的。)

    如果这不起作用,那么您用来生成 JAXB 类的 XML 模式可能是错误的:可能它没有指定 xs:date XML 模式类型的用法(可能它改用 xs:dateTime) .

    只有最后一个建议:手动创建您的 JAXB 类。然后,您可以在类的字段上指定 @XmlSchemaType 之类的注释,从而获得更多控制权。

    【讨论】:

    • +1 for @XmlSchemaType 有关如何使用日期/时间属性的更多信息,请参阅:blog.bdoughan.com/2011/01/jaxb-and-datetime-properties.html
    • 这很棒。我实现了它,它看起来好多了。现在不是我的 XML 看起来像这样:2011-01-01T00:00:00.000+02:00。它看起来像这样:2011-01-01+02:00。我还能做些什么来摆脱时区......所以它只显示日期部分?
    • 好吧...对不起,我想通了。我使用 DatatypeConstants.FIELD_UNDEFINED 作为时区设置。
    【解决方案2】:

    您需要使用 DateFormatter 将其格式化为仅 DATE 部分,忽略时间。

    类似:(new SimpleDateFormat("yyyy MMMM dd")).format(theDate));

    【讨论】:

      【解决方案3】:

      您可以利用 JAXB 外部绑定文件在您的对象模型中生成 GregorianCalendar。这将消除您进行转换的需要。可以在此处找到执行类似操作的示例:

      javax.xml.bing.DatatypeConverter 类可用于创建必要的XmlAdapter

      【讨论】:

        【解决方案4】:

        这对我有用:

        import javax.xml.datatype.DatatypeFactory;
        import javax.xml.datatype.XMLGregorianCalendar;
        
        Date fechaBajaPrevista = Calendar.getInstance().getTime();
        
        XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(
                                new SimpleDateFormat("yyyy-MM-dd").format(fechaBajaPrevista));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-26
          • 1970-01-01
          • 2017-09-26
          • 1970-01-01
          • 2014-01-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多