0

我正在研究一些警报功能,我正在使用 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 点(现在是一小时后)时触发。抱歉吐槽了,希望这个问题有点道理。

4

1 回答 1

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));

这在语义上更正确。

于 2013-02-12T20:46:26.800 回答