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 時を取得しようとすると、

java.lang.IllegalArgumentException: タイム ゾーン オフセット遷移による不正なインスタント: 2013-03-10T07:00:00.000

この場合、時間が存在しないことはわかっていますが、 と の間で何らかの遷移が発生し、その後自動的に修正されることを判断する簡単な方法はありますnowthen? 明らかに、修正はユースケースによって異なります。私の場合、時計が現在とその後の間に後退している場合に、1 時間遅れて DateTime オブジェクトを取得できるようにしたいと考えています。つまり、たとえば、ユーザーが午前 3 時にアラームを設定し、その後時計がその時間の前後に戻った場合、時計の時刻が午前 3 時 (現在は 1 時間後) になったときにアラームが起動します。暴言で申し訳ありませんが、この質問が何らかの意味をなすことを願っています。

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 に答える