6

ある時間がスケジュールに属しているか、別のスケジュールに属しているかを知りたいです。

私の場合は、時刻夜間スケジュール通常スケジュールかを計算するためのものです。

私はこの解決策にたどり着きました:

NIGHT = ["21:00", "06:00"]
def night?( date )
  date_str = date.strftime( "%H:%M" )
  date_str > NIGHT[0] || date_str < NIGHT[1]
end

しかし、私はあまりエレガントではなく、この具体的なケースでのみ機能し、すべての時間範囲では機能しないと思います.

(私はいくつかの同様の質問がSOであることがわかりましたが、それらはすべて日付範囲ではなく時間範囲を参照しています)

更新しました

ソリューションは、この具体的な時間範囲だけでなく、ランダムな時間範囲でも機能する必要があります。まあ言ってみれば:

"05:00"-"10:00"
"23:00"-"01:00"
"01:00"-"01:10"
4

2 に答える 2

11

これは実際には多かれ少なかれ私が行う方法ですが、もう少し簡潔になる可能性があります。

def night?( date )
    !("06:00"..."21:00").include?(date.strftime("%H:%M"))
end

または、スケジュールの境界を正時に残すことができる場合:

def night?(date)
    !((6...21).include? date.hour)
end

- に注意してください。...これは、基本的に「昼間は 6 時から 21 時ですが、21 時は含まれません」という意味です。

編集:これは一般的な(そして悲しいことに、はるかに簡潔な)解決策です:

class TimeRange
    private

    def coerce(time)
        time.is_a? String and return time
        return time.strftime("%H:%M")
    end

    public

    def initialize(start,finish)
        @start = coerce(start)
        @finish = coerce(finish)
    end

    def include?(time)
        time = coerce(time)
        @start < @finish and return (@start..@finish).include?(time)
        return !(@finish..@start).include?(time)
    end
end

通常の Range とほとんど同じように使用できます。

irb(main):013:0> TimeRange.new("02:00","01:00").include?(Time.mktime(2010,04,01,02,30))
=> true
irb(main):014:0> TimeRange.new("02:00","01:00").include?(Time.mktime(2010,04,01,01,30))
=> false
irb(main):015:0> TimeRange.new("01:00","02:00").include?(Time.mktime(2010,04,01,01,30))
=> true
irb(main):016:0> TimeRange.new("01:00","02:00").include?(Time.mktime(2010,04,01,02,30))
=> false

上記のクラスはタイムゾーンについて無知であることに注意してください。

于 2012-04-06T15:31:24.130 に答える
1

Rails 3.2 では、日付範囲を生成する方法として Time.all_day などが追加されました。それがどのように機能するかを見る必要があると思います。役に立つかもしれません。

于 2012-04-08T07:54:01.037 に答える