Строковая дата для преобразования 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?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time обратно переносится на Java 6 и 7 в ThreeTen-Backport.
  • Android

ThreeTen-Extraпроект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.