まず、時間を表すために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;
}
トリッキーなビットは平等です。上記のコードは、始点と終点が両方とも包括的であると想定しています。他の何かが必要な場合は、すべての状況について非常に慎重に考える必要があります.