Строковая дата для преобразования xmlgregoriancalendar
Я написал эту функцию:
public static XMLGregorianCalendar getXMLGregorianCalendar(String date) throws OmniException{
XMLGregorianCalendar xmlCalender=null;
GregorianCalendar calender = new GregorianCalendar();
calender.setTime(Util.stringToJavaDate(date));
xmlCalender = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);
return xmlCalender;
}
public static Date stringToJavaDate(String sDate) throws OmniException{
Date date=null;
date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(sDate);
return date;
}
Когда я отправляю дату как "2014-01-07"
, я получаю выходную дату как 2014-01-06T18:30:00:000Z
где я иду не так?
также, что делать, если я хочу получить только 2014-01-06T18:30:00
и 2014-01-06T18:30:00Z
Любая помощь приветствуется
Ответы
Ответ 1
Найденное решение, как показано ниже, разместив его, поскольку оно может помочь кому-то еще:)
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = format.parse("2014-04-24 11:15:00");
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
System.out.println(xmlGregCal);
Вывод:
2014-04-24T11:15: 00,000 + 02: 00
Ответ 2
Для меня самым элегантным решением является следующее:
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar("2014-01-07");
Использование Java 8.
Расширенный пример:
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar("2014-01-07");
System.out.println(result.getDay());
System.out.println(result.getMonth());
System.out.println(result.getYear());
Это выдает:
7
1
2014
Ответ 3
GregorianCalendar c = GregorianCalendar.from((LocalDate.parse("2016-06-22")).atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
Ответ 4
TL;DR
LocalDate.parse( "2014-01-07" )
.atStartOfDay( ZoneId.of( "America/Montreal" ) )
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )
2014-01-07 00:00:00
Дата-время!= Строка
Не сопоставляйте значение даты с его текстовым представлением. Мы анализируем строки, чтобы получить объект с датой, и мы просим объект времени для создания строки для представления ее значения. У объекта даты и времени нет формата, только строки имеют формат.
Итак, переместите свое мышление в два отдельных режима: модель и презентация. Определите значение даты, которое вы имеете в виду, применяя соответствующий часовой пояс в качестве модели. Когда вам нужно отобразить это значение, создайте строку в определенном формате, как ожидается от пользователя.
Избегать устаревших классов времени
В ответах на вопросы и другие ответы используются старые неудобные классы времени и времени, вытесняемые классами java.time.
ISO 8601
Ваша строка ввода "2014-01-07"
находится в стандартном формате ISO 8601.
T
в середине отделяет часть даты от временной части.
Z
на конце короткий для Zulu и означает UTC.
К счастью, классы java.time используют форматы ISO 8601 по умолчанию при разборе/генерации строк. Поэтому нет необходимости указывать шаблон форматирования.
LocalDate
Класс LocalDate
представляет значение даты только без времени и без часового пояса.
LocalDate ld = LocalDate.parse( "2014-01-07" ) ;
ld.toString(): 2014-01-07
Начало дня ZonedDateTime
Если вы хотите увидеть первый момент этого дня, укажите часовой пояс ZoneId
, чтобы получить момент на временной шкале, a ZonedDateTime
. Часовой пояс имеет решающее значение, поскольку дата изменяется по всему миру по зонам. Через несколько минут после полуночи в Париже Франция - новый день, еще "вчера" в Монреале Квебек.
Никогда не предполагайте, что день начинается в 00:00:00. Аномалии, такие как летнее время (DST), означают, что день может начинаться в другое время дня, например, 01:00:00. Пусть java.time определяет первый момент.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
zdt.toString(): 2014-01-07T00: 00: 00Z
Для желаемого формата сгенерируйте строку, используя предопределенный форматтер DateTimeFormatter.ISO_LOCAL_DATE_TIME
, а затем замените T
посередине на ПРОСТРАНСТВО.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " ) ;
2014-01-07 00:00:00
О java.time
Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советуем перейти на классы java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы java.time?
ThreeTen-Extraпроект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и больше.