it-roy-ru.com

Укажите формат даты в XMLGregorianCalendar

Я хочу использовать дату в формате XMLGregorianCalendar для отправки в веб-службу. Веб-сервис ожидает информацию в формате yyyy-dd-mm. Я использую приведенный ниже код для создания XMLGregorianCalendar и отправки его на веб-сервис.

Date dob = null;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

try {
    XMLGregorianCalendar date2;
    dob = df.parse("13/06/1983");

    GregorianCalendar c = new GregorianCalendar();
    c.setTimeInMillis(dob.getTime());
    date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
    System.out.println(date2);
}
catch(DatatypeConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
catch(ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

К сожалению, я всегда получаю дату в виде 1983-06-13T00:00:00.000-04:00. Время также включается в вывод. Можно ли получить только дату? Не могли бы вы мне помочь?

18
Deepika

вам не нужно указывать «SimpleDateFormat», это просто: Вы должны указать константу «DatatypeConstants.FIELD_UNDEFINED», где вы не хотите показывать

GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date());
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
23
fernandohealthchess

Да, понял ...

Date dob=null;
DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
dob=df.parse( "13/06/1983" );
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(dob);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);

Это даст его в правильном формате.

15
Deepika

Гораздо проще, используя только SimpleDateFormat, не передавая все параметры индивидуально:

    String FORMATER = "yyyy-MM-dd'T'HH:mm:ss'Z'";

    DateFormat format = new SimpleDateFormat(FORMATER);

    Date date = new Date();
    XMLGregorianCalendar gDateFormatted =
        DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(date));

Полный пример здесь .

Примечание: Это работает только для удаления двух последних полей: миллисекунд и часового пояса или для удаления всего временного компонента с помощью средства форматирования yyyy-MM-dd.

8
adimoldovan

Это простой способ для любого формата. Просто измените его на требуемую строку формата

XMLGregorianCalendar gregFmt = DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
System.out.println(gregFmt);
1
James

На самом деле не идеальное преобразование, но я хотел бы предоставить несколько вариантов.

Java.time

Во-первых, вы должны использовать LocalDate из Java.time, современный Java-интерфейс даты и времени, для анализа и хранения вашей даты. Избегайте Date и SimpleDateFormat, так как они имеют проблемы с дизайном и также давно устарели. Последнее, в частности, является печально известным.

    DateTimeFormatter originalDateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");

    String dateString = "13/06/1983";
    LocalDate date = LocalDate.parse(dateString, originalDateFormatter);
    System.out.println(date);

Результат:

1983-06-13

Вам нужно идти дальше? LocalDate.toString() создает формат, о котором вы спрашивали.

Форматировать и анализировать

Предполагая, что вам требуется XMLGregorianCalendar, первая и простая опция для конвертации:

    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(date.toString());
    System.out.println(xmlDate);

1983-06-13

Форматирование строки и ее синтаксический анализ возвращаются мне как пустая трата времени, но, как я уже сказал, это легко, и я не думаю, что есть какие-либо сюрпризы в отношении ожидаемого результата.

Пройти год, месяц и день месяца индивидуально

    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
            .newXMLGregorianCalendarDate(date.getYear(), date.getMonthValue(),
                    date.getDayOfMonth(), DatatypeConstants.FIELD_UNDEFINED);

Результат такой же, как и раньше. Нам нужно четко указать, что мы не хотим смещения часового пояса (это то, что указывает DatatypeConstants.FIELD_UNDEFINED). В случае, если кому-то интересно, и LocalDate, и XMLGregorianCalendar исчисляют месяцы, как это делают люди, поэтому нет необходимости добавлять или вычитать 1.

Конвертировать через GregorianCalendar

Я показываю вам только эту опцию, потому что я почему-то считаю ее официальным способом: преобразовать LocalDate в ZonedDateTime, затем в GregorianCalendar и, наконец, в XMLGregorianCalendar.

    ZonedDateTime dateTime = date.atStartOfDay(ZoneOffset.UTC);
    GregorianCalendar gregCal = GregorianCalendar.from(dateTime);
    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(gregCal);
    xmlDate.setTime(DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
            DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
    xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

Мне нравится само преобразование, поскольку нам не нужно ни использовать строки, ни передавать отдельные поля (с осторожностью, чтобы сделать это в правильном порядке). Что мне не нравится, так это то, что мы должны передавать время суток и смещение часового пояса, а затем стирать эти поля вручную.

1
Ole V.V.