これは実際には多かれ少なかれ私が行う方法ですが、もう少し簡潔になる可能性があります。
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
上記のクラスはタイムゾーンについて無知であることに注意してください。