Как добиться этого формата даты в календаре - PullRequest
0 голосов
/ 14 февраля 2020

Мне нужно создать объект XMLGregorianCalendar с этим форматом даты «ГГГГ-ММ-ДДТЧ: MI: SS ± TZ», например «2015-07-01T17: 42: 49 + 04»

У меня нет Идея как это сделать. Я использовал несколько способов, как конвертировать дату, но этот шаблон, похоже, не работает.

После некоторых экспериментов я обнаружил, что "YYYY-MM-dd'T'HH: mm: ssX "даст мне желаемый результат. Но это строка, и я не могу достичь того же формата с XMLGregorianCalendar.

Это дает мне «2015-07-01T17: 42: 4234 + 05: 00», поскольку вы видите, что есть дополнительные символы, которые мне не нужны.

1 Ответ

2 голосов
/ 14 февраля 2020

Объекты даты и времени не имеют формата

Объект XMLGregorianCalendar с этим форматом даты

Объекты даты и времени, такие как XMLGregorianCalendar do не иметь «формат». Они внутренне представляют значение даты и времени каким-либо образом, хотя вряд ли это будет в тексте.

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

java .time

Класс XMLGregorianCalendar теперь устарел. Подменяется современными java .time классами, определенными в JSR 310.

Анализирует вашу входную строку как OffsetDateTime, так как in включает смещение от UT C, но не часовой пояс.

OffsetDateTime odt = OffsetDateTime.parse( "2015-07-01T17:42:49+04" );

Создание текста в стандартном формате ISO 8601 .

String output = odt.toString() ;  // Generates text in ISO 8601 format.

2015-07-01T17: 42: 49 + 04 : 00

Части смещения

Часть в конце - это смещение от UT C, на несколько часов-минут-секунд вперед или позади простого меридиан. В ISO 8601 знак плюс является положительным числом, которое означает впереди от UT C. Знак минус - это отрицательное число, означающее позади UT C.

Подавление частей смещения

Некоторые люди могут сбрасывать секунды при обнулении или сбрасывать минут, когда ноль. Но подавление этих цифр не меняет смысла. Все эти три строки представляют один и тот же момент:

  • 2015-07-01T17:42:49+04
  • 2015-07-01T17:42:49+04:00
  • 2015-07-01T17:42:49+04:00:00

Вы сказал:

"2015-07-01T17: 42: 4234 + 05: 00", как вы видите, есть дополнительные символы, которые мне не нужны.

[Полагаю, вы действительно имели в виду "2015-07-01T17:42:49+04:00", но сделали опечатки.]

Тебе действительно не стоит беспокоиться об этом На самом деле, я рекомендую всегда указывать часы и минуты, поскольку я видел несколько библиотек / протоколов, которые ожидают часы и минуты, прерывая работу, если не указывать. Хотя минуты и секунды действительно являются необязательными в ISO 8601, когда их значение равно нулю, я предлагаю всегда включать минуты, когда ноль.

DateTimeFormatter

Если вы настаиваете иначе, вам понадобится использовать DateTimeFormatter класс и, возможно, DateTimeFormatterBuilder, чтобы подавить минуты, когда ноль. Возможно это:

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssx" );
String output = odt.format( f );

2015-07-01T17: 42: 49 + 04

Код x в этом шаблоне форматирования подавлял минуты и секунды , если их значение равно нулю.

Если вы выполняете свое собственное форматирование, не обрезайте его, если оно не равно нулю, иначе ваш результат будет ложным (другой момент). Возьмем, к примеру, представление этого момента в Индии, где текущее смещение составляет пять с половиной часов (смещение включает 30 минут, а не ноль).

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
OffsetDateTime odtKolkata = zdt.toOffsetDateTime();

Дамп на консоль.

System.out.println( "odtKolkata = " + odtKolkata );

2015-07-01T19: 12: 49 + 05: 30

XMLGregorianCalendar

Если вам абсолютно необходимо использовать старый унаследованный класс XMLGregorianCalendar, вы можете создать его из вывода ISO 8601 нашего OffsetDateTime объекта, показанного в коде выше. См. этот ответ по другому вопросу.

XMLGregorianCalendar xgc = null;
try
{
    xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar( odt.toString() );
}
catch ( DatatypeConfigurationException e )
{
    e.printStackTrace();
}
System.out.println( "xgc.toString(): " + xgc );

xg c .toString (): 2015-07-01T17: 42: 49 + 04: 00


О java .time

В java .time интегрирован фреймворк Java 8 и позже. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Учебник Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java .time классов.

Вы можете обмениваться java .time объектами непосредственно с вашей базой данных. Используйте драйвер JDB C , соответствующий JDB C 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где взять классы java .time?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 и более поздних версий - часть стандартного API Java со связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большинство функций java .time перенесено на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android комплектных реализаций java .time классов.
    • Для более ранних Android (<26) <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP проект адаптируется ThreeTen-Backport (упомянуто выше). См. Как использовать ThreeTenABP… .
...