这是我第一次在 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 具有指定的日期和时间。我只想要日期(年月日)。
有什么建议吗?
谢谢
最佳答案
使用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
Calendar.ZONE_OFFSET
以毫秒为单位,而 newXMLGregorianCalendarDate(...)
方法期望时区值以分钟为单位,因此需要对其进行转换。)
(另请注意,Calendar 的
月份索引是从 0 开始的,而 XMLGregorianCalendar 的
月份是从 1 开始的。)
如果这不起作用,那么您用来生成 JAXB 类的 XML 模式可能是错误的:可能它没有指定 xs:date
XML 模式类型的用法(可能是它使用 xs:dateTime
代替)。
最后一个建议:手动创建 JAXB 类。然后你可以指定像@XmlSchemaType
这样的注释在你的类(class)领域给你更多的控制权。
关于Java解析XML日期-排除时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7736148/