【发布时间】:2013-01-28 03:59:02
【问题描述】:
我正在开发一些闹钟功能,我正在使用 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:00,那么我们将得到一个
java.lang.IllegalArgumentException:由于时区而导致的非法瞬间 偏移过渡:2013-03-10T07:00:00.000
我知道在这种情况下根本不存在时间,但是有一种简单的方法可以确定now 和then 之间发生了一些转换,然后自动进行更正。显然,更正取决于您的用例。就我而言,我希望它是这样,如果从现在到现在时钟回落,我会得到一个延迟一个小时的 DateTime 对象。换句话说,例如,如果用户将闹钟设置为凌晨 3 点,然后时钟在该时间附近向后移动,则闹钟将在时钟时间显示为凌晨 3 点(现在是一小时后)时触发。抱歉吐槽了,希望这个问题有点道理。
【问题讨论】:
-
优点@Clockwork-Muse。我要研究切换类型。我不确定这将如何帮助我推理/避免这些类型的错误。执行
LocalDate localDate = new LocalDate().withMonthOfYear(3).withDayOfMonth(10); LocalTime localTime = new LocalTime().withHourOfDay(2); DateTime dateTime = localDate.toDateTime(localTime);之类的操作仍然会导致错误。 -
构造一个
LocalDateTime()然后使用DateTimeZone.isLocalDateTimeGap(...)应该能够找到它们。此外,DateTimeZone.getMillisKeepLocal(...)似乎是“间隙安全”,因为它从给定的“本地”值返回时区的“下一个可用”时间。 -
@Clockwork-Muse 非常感谢。但是我如何从 LocalDateTime 获得一个瞬间传递给 getMillisKeepLocal?
-
另外,如果 isLocalDateTimeGap 返回 true,我如何才能确定转换的方向,即向后或向前?