我正在研究一些警报功能,我正在使用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.IllegalArgumentException:由于时区而导致的非法即时 抵消过渡期:2013-03-10T07:00:00.000
我知道在这种情况下,时间根本不存在,但有一种简单的方法可以确定now
和then
之间发生了一些转换,然后自动进行更正。显然,更正取决于您的用例。在我的情况下,我希望它是如此,如果时钟在现在和之后回落,我得到一个DateTime对象延迟一个小时。换句话说,例如,如果用户在凌晨3点设置闹钟,然后时钟在该时间内向后移动,则当时钟时间读取凌晨3点(现在是一小时后)时,闹钟将会触发。抱歉咆哮,希望这个问题有道理。
答案 0 :(得分:1)
您可以通过牙齿说谎警报的日期/时区。例如:
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));
更多,呃,语义正确。