Joda - 独立时间获得夏令时的正确方法

时间:2013-02-12 18:38:05

标签: java datetime jodatime

我正在研究一些警报功能,我正在使用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

我知道在这种情况下,时间根本不存在,但有一种简单的方法可以确定nowthen之间发生了一些转换,然后自动进行更正。显然,更正取决于您的用例。在我的情况下,我希望它是如此,如果时钟在现在和之后回落,我得到一个DateTime对象延迟一个小时。换句话说,例如,如果用户在凌晨3点设置闹钟,然后时钟在该时间内向后移动,则当时钟时间读取凌晨3点(现在是一小时后)时,闹钟将会触发。抱歉咆哮,希望这个问题有道理。

1 个答案:

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

更多,呃,语义正确。