Java 如何防止Joda Time在巴西DST转换期间引发异常

Java 如何防止Joda Time在巴西DST转换期间引发异常,java,jodatime,Java,Jodatime,今天,我们的巴西用户正在为我们生成大量的事故报告。我追踪到了这段代码,它抛出了一个Joda异常: 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[]

今天,我们的巴西用户正在为我们生成大量的事故报告。我追踪到了这段代码,它抛出了一个Joda异常:

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);
    }
}
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)
例外情况:

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);
    }
}
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)
我在OSX10.11上使用Java1.8.060,JodaTime2.8.2


什么样的解决方法可以让我正确地获取DateTime实例,该实例表示一天开始后偏移毫秒的当前时间?

不要使用LocalTime。创建日期时间,并以毫秒为单位添加偏移量:

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

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