Используйте 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
month основан на 0, в то время как XMLGregorianCalendar's
month основан на 1.)
Если это не работает, то схема XML, которую вы использовали для генерации классов JAXB, вероятно, ошибочна: возможно, в ней не указано использование типа схемы xs:date
XML (возможно, вместо нее используется xs:dateTime
) .
Только один последний совет: создавайте свои классы JAXB вручную. Затем вы можете указать аннотации типа @XmlSchemaType
в полях ваших классов, что даст вам гораздо больше контроля.