Rrule До значения тега данных - PullRequest
       21

Rrule До значения тега данных

0 голосов
/ 25 февраля 2019

Я работаю над проектом, который использует правила для генерации следующих вхождений.Но я не могу понять, что мне нужно поместить в тег UNTIL из правила.

String str="RRULE:FREQ=MONTHLY;UNTIL=20190625T000000Z;INTERVAL=2;";

Как конвертировать дату в "20190625T000000Z". Я использую Java-библиотеку rfc 2445.Если пользователь вводит дату в виде строки, например: 25/06/2019...... мне нужно установить это значение в теге UNTIL, как показано выше.Если я установлю значение по умолчанию в UNTIL, тогда оно будет работать, но не тогда, когда я сделаю его удобным для пользователя. Я беру все значения от пользователя в качестве даты начала, даты окончания, интервала, дня, до ...установить до.Если кто-то может помочь .. Заранее спасибо.

1 Ответ

0 голосов
/ 25 февраля 2019

Синтаксический анализ базового формата 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?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 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… .

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

...