Объекты даты и времени не имеют формата
Объект 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?