Jodatime: недопустимый момент из-за перехода смещения часового пояса (переход на летнее время) - PullRequest
0 голосов
/ 03 апреля 2019

Этот сбой произошел 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 Ответ

1 голос
/ 03 апреля 2019

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

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

Решение:

Поймайте исключение и попробуйте добавить 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);
 }
...