Jodatime: незаконный мгновенный переход из-за смещения часового пояса («разрыв» перехода на летнее время)

#android #jodatime

#Android #jodatime

Вопрос:

Этот сбой произошел 2 дня назад, и я не могу понять, почему. Все работает отлично в течение 1 года:

 Fatal Exception: org.joda.time.IllegalFieldValueException Value 2 for hourOfDay is not supported: Illegal instant due to time zone offset transition (daylight savings time 'gap'): 2019-03-31T02:09:00.000 (Europe/Paris)
  

Мой код:

 DateTime dtToRefresh = mDateTime != null ? mDateTime : DateTime.now();
                        dtToRefresh = dtToRefresh.secondOfMinute().setCopy(0);
                        dtToRefresh = dtToRefresh.millisOfSecond().setCopy(0);
                        dtToRefresh = dtToRefresh.hourOfDay().setCopy(hourOfDay);
                        dtToRefresh = dtToRefresh.minuteOfHour().setCopy(minute);
  

Сбой начался на:

 dtToRefresh = dtToRefresh.hourOfDay().setCopy(hourOfDay);
  

«hourOfDay» — это час с момента выбора даты и времени (классический процесс).

У вас есть какие-нибудь способы расследования?

Большое вам спасибо!

Ответ №1:

Для Парижа переход на летнее время начинается 31 марта, поэтому с этого дня ваш код получает сбой. Итак, вы не внедрили свой код для поддержки летнего времени.

Если вы тратите время вручную, это означает, что вам нужно ввести летнее время для этого часового пояса. Если это занимает системное время, значит, проблем нет.

Решение:

Перехватите исключение и попробуйте добавить 1 час или вычесть один час, который применим.

  try 
 {
   DateTime dtToRefresh = mDateTime != null ? mDateTime : DateTime.now();
                    dtToRefresh = dtToRefresh.secondOfMinute().setCopy(0);
                    dtToRefresh = dtToRefresh.millisOfSecond().setCopy(0);
                    dtToRefresh = dtToRefresh.hourOfDay().setCopy(hourOfDay);
                    dtToRefresh = dtToRefresh.minuteOfHour().setCopy(minute);
 } 
 catch (IllegalArgumentException iae) 
 { 
    dttoRefresh.plusHours(1);
 }
  

Комментарии:

1. Спасибо за этот ответ, но как я могу это сделать?

2. Откуда приходит mDateTime?

3. Я добавил решение

4. Большое вам спасибо @Magudesh!