这是我第一次使用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具有指定时间的日期。我只想要日期(年 - 月 - 日)。
有什么建议吗?
由于
答案 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));