Синтаксический анализ базового формата ISO 8601
Ваш ввод 20190625T000000Z
является «базовым» вариантом стандартного формата ISO 8601 для представления момента в UTC .Слово «базовый» означает минимизацию использования разделителей (я не рекомендую этого, поскольку это делает строку менее читаемой людьми).
Определение шаблона форматирования для соответствия вводу.
String input = "20190625T000000Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmmssX" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );
Дамп в консоль.
System.out.println("odt.toString(): " + odt);
См. Этот код, запущенный в режиме реального времени на IdeOne.com .
odt.toString(): 2019-06-25T00: 00Z
Перевод даты в момент
Если пользователь вводит дату в виде строки, например: 25/06/2019 ...... мне нужно установить это значение в теге UNTIL, как показано выше
Сначала проанализируйте эту входную строку в LocalDate
, представляющем значение только для даты, без времени дняи без часового пояса.
DateTimeFormatter fDateOnly = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "25/06/2019" , fDateOnly );
ld.toString (): 2019-06-25
Что касается перевода этой даты в момент (дата со временем-дня в зоне или смещение от UTC), что сложнее, чем звучит интуитивно.
Дата, такая как 25 июня 2019 года, представляет собой целый день.И теоретическая дата в этом.Моменты, когда день начинается и заканчивается, различаются по всему земному шару в зависимости от часового пояса.Новый день начинается гораздо раньше в Токио, Япония, чем в Париже, Франция, и даже позже, в Монреале, Квебеке.
Другая проблема заключается в том, что день не всегда начинается в 00:00:00.Из-за таких аномалий, как летнее время (DST), первый момент дня в некоторые даты в некоторых зонах может быть примерно 01:00:00.Пусть классы java.time определяют первый момент.
ZoneId z = ZoneId.of( "Africa/Tunis" );
ZonedDateTime zdt = ld.atStartOfDay( z );
zdt.toString (): 2019-06-25T00: 00 + 01: 00 [Африка / Тунис]
Этот ZonedDateTime
объект представляет определенный момент.Но он использует настенные часы, принятые людьми определенного региона (часового пояса).Ваша цель - момент в UTC.К счастью, мы можем отрегулировать от зоны до UTC, преобразовав в OffsetDateTime
(дату и время с контекстом смещения от UTC, а не с часовым поясом).Мы можем указать UTC (смещение нуля) с помощью константы ZoneOffset.UTC
.
OffsetDateTime odt = zdt.toOffsetDateTime().withOffsetSameInstant( ZoneOffset.UTC );
odt.toString (): 2019-06-24T23: 00Z
Обратите внимание, что 00:00 25-го в Тунисе 11 вечера «вчера» 24-го в UTC.Тот же самый момент, та же самая одновременная точка на временной шкале, но два разных времени настенных часов.
Наконец, нам нужна строка в этом «базовом» формате ISO 8601.Используйте тот же форматер, который мы определили выше.
DateTimeFormatter fIso8601DateTimeBasic = DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmmssX" );
String output = odt.format( fIso8601DateTimeBasic );
вывод: 20190624T230000Z
См. Этот код, запущенный на IdeOne.com .
Какова разница между часовым поясом и смещением от UTC?Смещение - это просто количество часов, минут и секунд.Не больше, не меньше, просто число (ну, три цифры).Часовой пояс гораздо больше.Часовой пояс - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона.Например, в большей части Северной Америки смещение меняется два раза в год, начиная с часа вперед, а затем с уменьшением на час (бездействие Летнее время (DST) ).
Совет. Обработка даты и времени на удивление хитрая и скользкая.Если вы работаете с календарями и спецификацией iCalendar для обмена данными, я предлагаю вам уделить много времени изучению концепций и практики с ведущими в отрасли java.time классами.
О java.time
Среда java.time встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация JSR 310 .
Joda-Time проект, теперь в режиме обслуживания , советует перейти на классы java.time .
Вы можете обменять java.time объекты непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .