如何防止 Joda Time 在巴西 DST 过渡期间抛出异常
How can I prevent Joda Time throwing an exception during Brazilian DST transition period
今天,我们的巴西用户正在为我们生成大量崩溃报告。我已经追踪到这段代码,它抛出了一个 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)
我在 OS X 10.11 上使用 Java 1.8.0_60 和 Joda Time 2.8.2.
什么变通方法可以让我正确地获取表示当天时间的 DateTime 实例,即一天开始后 offset 毫秒?
不要通过 LocalTime。创建一个 DateTime,并添加以毫秒为单位的偏移量:
DateTime startOfDay = LocalDate.now().toDateTimeAtStartOfDay();
DateTime dateTime = startOfDay.plus(offset);
System.out.println("dateTime = " + dateTime);
今天,我们的巴西用户正在为我们生成大量崩溃报告。我已经追踪到这段代码,它抛出了一个 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)
我在 OS X 10.11 上使用 Java 1.8.0_60 和 Joda Time 2.8.2.
什么变通方法可以让我正确地获取表示当天时间的 DateTime 实例,即一天开始后 offset 毫秒?
不要通过 LocalTime。创建一个 DateTime,并添加以毫秒为单位的偏移量:
DateTime startOfDay = LocalDate.now().toDateTimeAtStartOfDay();
DateTime dateTime = startOfDay.plus(offset);
System.out.println("dateTime = " + dateTime);