Java разбирает дату XML - исключить время - PullRequest
1 голос
/ 12 октября 2011

Впервые я интенсивно работаю с XML в Java. Код использует 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 ]

2 голосов
/ 12 октября 2011

Используйте 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 в полях ваших классов, что даст вам гораздо больше контроля.

0 голосов
/ 06 июля 2018

Это работает для меня:

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));
0 голосов
/ 12 октября 2011

Вы можете использовать внешний файл привязки JAXB для создания GregorianCalendar в вашей объектной модели.Это избавит вас от необходимости делать преобразование.Пример выполнения чего-то подобного можно найти здесь:

Класс javax.xml.bing.DatatypeConverter может быть полезен при создании необходимого XmlAdapter.

0 голосов
/ 12 октября 2011

Вам необходимо использовать DateFormatter, который форматирует его только в часть DATE, игнорируя время.

Что-то вроде: (new SimpleDateFormat("yyyy MMMM dd")).format(theDate));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...