2015-10-18 27 views
6

Dzisiaj nasi brazylijscy użytkownicy generują dla nas mnóstwo raportów o awariach. Mam śledzone ją w dół do tego kodu, który zgłasza wyjątek Joda:Jak mogę zapobiec wyjątkowi Joda Time podczas brazylijskiego okresu przejściowego DST

import org.joda.time.DateTime; 
import org.joda.time.DateTimeUtils; 
import org.joda.time.DateTimeZone; 
import org.joda.time.LocalTime; 

public class ScratchSpace { 

    public static void main(String[] args) { 
     // force Joda to act like we are in Sao Paolo on 2015-10-18 
     DateTimeUtils.setCurrentMillisFixed(1445185758078L); // 2015-10-18T18:29 
     DateTimeZone.setDefault(DateTimeZone.forID("America/Sao_Paulo")); 

     // most of users have offset == 0, but it could be any number of millis from 0 to 86_400_000-1 (millis in day) 
     int offset = 0; 

     // local time at start of day + offset millis 
     final LocalTime localTime = LocalTime.fromMillisOfDay(offset); 

     // convert to a time on the current day 
     DateTime dateTime = localTime.toDateTimeToday(); // throws org.joda.time.IllegalFieldValueException exception 
     System.out.println("dateTime = " + dateTime); 
    } 
} 

The wyjątek:

Exception in thread "main" org.joda.time.IllegalFieldValueException: Value 0 for hourOfDay is not supported: Illegal instant due to time zone offset transition (daylight savings time 'gap'): 2015-10-18T00:29:18.078 (America/Sao_Paulo) 
    at org.joda.time.chrono.ZonedChronology$ZonedDateTimeField.set(ZonedChronology.java:486) 
    at org.joda.time.chrono.BaseChronology.set(BaseChronology.java:240) 
    at org.joda.time.LocalTime.toDateTimeToday(LocalTime.java:1287) 
    at org.joda.time.LocalTime.toDateTimeToday(LocalTime.java:1270) 

Używam Java 1.8.0_60 na OS X 10.11 z Joda Czas 2.8. 2.

Co obejść pozwoli mi poprawnie uzyskać wystąpienie DateTime reprezentujące czas w bieżącym dniu, który jest przesunięcie milisekund po rozpoczęciu dnia?

Odpowiedz

3

Nie jedź w LocalTime. Utwórz DateTime i dodaj przesunięcie w milisekundach:

DateTime startOfDay = LocalDate.now().toDateTimeAtStartOfDay(); 
DateTime dateTime = startOfDay.plus(offset); 

System.out.println("dateTime = " + dateTime);