1

特定の時間範囲内でのみ実行される関数があります。ユーザーは、開始時間と終了時間を入力して、この時間範囲を指定できます。

私がぶつかった問題は、時間範囲が数日にわたる場合です。例: start range hour: 18 (18:00 午後 6 時) end range hour: 6 (06:00 午前 6 時)

シンプルな:

if( hour >= startrange && hour <= endrange ) { now in range }

この場合は機能しません。

この問題の解決策を思いつくのは難しいと思います。たぶん、私の心は今日で十分です。( ;) )

誰でも私を方向に向けることができますか?

4

2 に答える 2

0

まず、時間を表すためにJoda TimeとそのLocalTime型を使用します。その後、次のことができます。

static boolean isInRange(LocalTime start, LocalTime end, LocalTime value) {
    // Avoid equality problems - see description
    if (value.equals(start) || value.equals(end)) {
        return true;
    }
    if (start.compareTo(end) > 0) {
        return !isInRange(end, start, value);
    }
    return start.compareTo(value) < 0 && value.compareTo(end) < 0;
}

言い換えれば、通常value、開始/終了範囲を取得した場合にのみ最終比較を行うことになりますstart <= endが、逆に開始すると、逆比較の結果を反転させるだけです.

つまり、何かが範囲内 (午前 2 時、午後 10 時) にない場合は、範囲内 (午後 10 時、午前 2時) です。

または、再帰呼び出しを回避できます。

static boolean isInRange(LocalTime start, LocalTime end, LocalTime value) {
    return start.compareTo(end) > 0
        // Reversed: if it's earlier than the end point, or later than the start
        ? value.compareTo(end) <= 0 || start.compareTo(value) <= 0
        : start.compareTo(value) <= 0 && value.compareTo(end) <= 0;
}

トリッキーなビットは平等です。上記のコードは、始点と終点が両方とも包括的であると想定しています。他の何かが必要な場合は、すべての状況について非常に慎重に考える必要があります.

于 2012-11-01T15:47:52.007 に答える