Формат XMLGregorianCalendar в Java

У меня есть строка даты, которая выглядит так же, как это.

2017-12-06T17: 39: 00Z

Что я хотел бы сделать, это преобразовать эту строку в XMLGregorianCalendar, но с использованием того же формата.

Что я делаю в данный момент:

String choosenDate = 2017-12-06T17:39:00Z;

GregorianCalendar c = new GregorianCalendar();

DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME;
TemporalAccessor accessor = timeFormatter.parse(dateChoisie);

Date date = Date.from(Instant.from(accessor));
c.setTime(date);
System.err.println("choosenDate: " + dateChoisie);
System.err.println("date : " + date);
XMLGregorianCalendar dateXMLGreg = null;
try
{
    dateXMLGreg = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
    System.err.println("dateXMLGreg: " + dateXMLGreg);
}
catch (DatatypeConfigurationException e)
{
    messages.addMessage(new MessageBuilder().error().code("webservice.failure").build());
}

что дает мне следующий вывод:

10: 47: 45,957 ОШИБКА [stderr] (задание по умолчанию-47) выбранаДата: 2017-12-06T17:39:03Z

10: 47: 45,957 ОШИБКА [stderr] (задание по умолчанию-47) дата: ср. 06 декабря 18:39:03 CET 2017

10: 47: 45,958 ОШИБКА [stderr] (задание по умолчанию-47) dateXMLGreg: 2017-12-06T18:39:03.000+01:00

Итак, как я могу это сделать, у меня есть мой XMLGregorianCalendar dateXMLGreg, чтобы выглядеть так:

2017-12-06T17: 39: 03Z

2 ответа

Решение

Это проще, чем вы думаете.

    String isoDateTime = "2017-12-06T17:39:00Z";
    XMLGregorianCalendar dateXMLGreg = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(isoDateTime);
    System.out.println(dateXMLGreg);

Это печатает

2017-12-06T17:39:00Z

newXMLGregorianCalendar имеет перегруженную версию, которая принимает строку - вашу строку - в качестве аргумента. Я надеюсь, что вы добавите попробовать / поймать, как в вашем вопросе.

Изменить: ваш XMLGregorianCalendar будут установлены миллисекунды DatatypeConstants.FIELD_UNDEFINED, Это должно быть так, чтобы не печатать миллисекунды как часть результата от toString() (который вызывается неявно, когда вы печатаете XMLGregorianCalendar).

Еще одно редактирование: как правильно сказал Василий Бурк в комментарии, в зависимости от того, что вам нужно XMLGregorianCalendar для, вы можете использовать и даже извлечь выгоду из использования класса из java.timeсовременный API даты и времени Java. Например:

    Instant dateInst = Instant.parse(isoDateTime);
    System.out.println(dateInst);

Это дает точно такой же вывод, как указано выше, 2017-12-06T17:39:00Z, Instant класс будет работать только если смещение всегда Zчто, вероятно, так как это было то, что вы просили вернуть. Потенциальные преимущества java.time include (1) API, как правило, гораздо приятнее работать (2), если вам нужны дополнительные операции с датой и временем, современный API предлагает множество из них. Если смещение может отличаться, вы можете поэкспериментировать с OffsetDateTime, но это более длинная история, которую я оставлю для другого вопроса.

Как это.

    private XMLGregorianCalendar change(String dateStr) {
    XMLGregorianCalendar xmlDate = null;

    try {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        Date date = format.parse(dateStr);

        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);

        xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
        System.out.println(xmlDate.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }

    return xmlDate;
}
Другие вопросы по тегам