Java解析XML日期 - 排除时间

时间:2011-10-12 06:34:40

标签: java parsing

这是我第一次使用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具有指定时间的日期。我只想要日期(年 - 月 - 日)。

有什么建议吗?

由于

4 个答案:

答案 0 :(得分:2)

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

我不知道您的代码段中的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模式类型的用法(可能它使用{{1而不是)。

只有最后一条建议:手动创建JAXB类。然后,您可以在类的字段中指定@XmlSchemaType等注释,从而为您提供更多控制权。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以利用JAXB外部绑定文件,以便在对象模型中生成GregorianCalendar。这将消除您进行转换的需要。在这里可以找到做类似事情的例子:

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

答案 3 :(得分:0)

这对我有用:

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));