我正在开发一些报警功能,并使用Joda计算每个报警时间的毫秒数。我有一些实用的方法,比如:
public static DateTime getNextDateTimeWithHourMinute(int hour, int minute) {
DateTime now = new DateTime();
DateTime then = now
.withHourOfDay(hour)
.withMinuteOfHour(minute)
.withSecondOfMinute(0)
.withMillisOfSecond(0);
return then.isBefore(now) ? then.plusDays(1) : then;
}
它为我计算了下一次发生的时间。问题是,如果我们试图得到,例如,3月10日凌晨2点,那么我们会得到
java.lang.IollegalArgumentException:由于时区原因,瞬间非法偏移转换:2013-03-10T07:00:00.000
我知道在这种情况下,时间根本不存在,但有没有一种简单的方法可以确定now
和then
之间发生了一些转换,然后自动进行更正。显然,更正取决于您的用例。在我的情况下,我希望它是这样的,如果时钟从现在到那时回落,我会得到一个延迟了一个小时的DateTime对象。换句话说,例如,如果用户将闹钟设置为凌晨3点,然后时钟在该时间前后向后移动,那么当时钟时间读取为凌晨3时(现在是一小时后),闹钟就会响起。很抱歉,希望这个问题能讲得通。
您可以对闹钟的日期/时区撒谎。例如:
LocalDate localDate = new LocalDate().withMonthOfYear(3).withDayOfMonth(10);
LocalTime localTime = new LocalTime().withHourOfDay(2);
DateTime dateTime = localDate.toDateTime(localTime, DateTimeZone.UTC);
DateTime dt = new DateTime(DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), dateTime.getMillis()));
System.out.println(dateTime);
System.out.println(dt);
在我的情况下打印出来:
2013-03-10T02:09:42.333Z
2013-03-10T03:09:42.333-07:00
(我住在华盛顿)
然而,我认为最好使用以下顺序的东西:
DateTime.now().toLocalDateTime().isBefore(new LocalDateTime(2013, 3, 10, 2, 0));
这在语义上更正确。