Java解析XML日期 - 排除时间

Java解析XML日期 - 排除时间

问题描述:

这是我第一次在Java中使用XML进行强化工作。代码使用JAXB生成类然后解析。我有一个XML与日期...被JAXB从我的XML生成Java解析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这是生成的,具有指定时间的日期。我只想要日期(年 - 月 - 日)。

有什么建议吗?

感谢

使用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'sCalendar.ZONE_OFFSET是以毫秒为单位和newXMLGregorianCalendarDate(...)方法需要以分钟为单位的时区值,因而它需要被转换。)

(还要注意,Calendar's个月索引是基于0,而XMLGregorianCalendar's月份为1)。

如果这样不起作用,那么用于生成JAXB类的XML模式可能是错误的:也许它没有指定使用xs:date XML模式类型(可能它使用改为)。

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

+0

对于'@ XmlSchemaType',获取更多关于如何使用日期/时间属性的更多信息,请参阅:http:// blog。bdoughan.com/2011/01/jaxb-and-datetime-properties.html –

+0

这很棒。我实现了它,它看起来好多了。现在,而不是我的XML看起来像这样: 2011-01-01T00:00:00.000 + 02:00 CoverStartDate>。它看起来像这样: 2011-01-01 + 02:00 CoverStartDate>。还有什么我可以做的更多来摆脱时区...所以它只显示日期部分? – user990855

+0

好吧...对不起,我想通了。我使用DatatypeConstants.FIELD_UNDEFINED作为时区设置。 – user990855

您需要使用格式化为仅日期部分,忽略了时间DateFormatter。

喜欢的东西:(new SimpleDateFormat("yyyy MMMM dd")).format(theDate));

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

javax.xml.bing.DatatypeConverter类可以创造必要的XmlAdapter有用。