Формат 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;
}