Как я могу проверить, является ли текущее время между сегодняшним вечером 9 вечера и 9 утра (завтра) в Ruby on Rails - PullRequest
9 голосов
/ 28 сентября 2011

Мне нужно проверить, находится ли мое текущее время между указанным интервалом времени (сегодня вечером 9 вечера и 9 утра завтра). Как это можно сделать в Ruby on Rails.

Заранее спасибо

Ответы [ 6 ]

13 голосов
/ 26 мая 2013

Очевидно, что это старый вопрос, уже помеченный правильным ответом, однако я хотел опубликовать ответ, который может помочь людям найти тот же вопрос с помощью поиска.

Проблемаответ, помеченный как правильный, означает, что ваше текущее время может быть после полуночи, и в этот момент предлагаемое решение не будет выполнено.

Вот альтернатива, которая учитывает эту ситуацию.

now = Time.now

if (0..8).cover? now.hour 
# Note: you could test for 9:00:00.000 
#       but we're testing for BEFORE 9am.
#       ie. 8:59:59.999
  a = now - 1.day
else 
  a = now
end

start = Time.new a.year, a.month, a.day, 21, 0, 0
b = a + 1.day
stop = Time.new b.year, b.month, b.day, 9, 0, 0

puts (start..stop).cover? now

Опять же, используйте include? вместо cover? для ruby ​​1.8.x

Конечно, вы должны перейти на Ruby 2.0

3 голосов
/ 28 сентября 2011

Создайте объект Range, имеющий два экземпляра Time, которые определяют требуемый диапазон, затем используйте метод #cover? (если вы используете ruby ​​1.9.x):

now = Time.now
start = Time.gm(2011,1,1)
stop = Time.gm(2011,12,31)

p Range.new(start,stop).cover? now # => true

Обратите внимание, что здесь я использовал явный конструктор метода, чтобы прояснить, что мы используем Range экземпляр. Вместо этого вы можете безопасно использовать конструктор ядра (start..stop).

Если вы все еще используете Ruby 1.8, используйте метод Range#include? вместо Range#cover?:

p (start..stop).include? now
2 голосов
/ 28 сентября 2011
require 'date'

today = Date.today
tomorrow = today + 1

nine_pm = Time.local(today.year, today.month, today.day, 21, 0, 0)
nine_am = Time.local(tomorrow.year, tomorrow.month, tomorrow.day, 9, 0, 0)

(nine_pm..nine_am).include? Time.now #=> false 
1 голос
/ 01 июня 2017

, если время между днями:

(start_hour..end_hour) .include?Time.zone.now.hour

0 голосов
/ 19 июня 2015

Вот как я могу проверить, наступит ли завтра событие в Rails 3.x

(event > Time.now.tomorrow.beginning_of_day) && (event < Time.now.tomorrow.end_of_day)
0 голосов
/ 18 июня 2015

Это может читаться лучше в нескольких ситуациях, и логика будет проще, если у вас есть 18.75 для "18:45"

def afterhours?(time = Time.now)
  midnight = time.beginning_of_day
  starts = midnight + start_hours.hours + start_minutes.minutes
  ends = midnight + end_hours.hours + end_minutes.minutes
  ends += 24.hours if ends < starts
  (starts...ends).cover?(time)
end

Я использую 3 точки, потому что я не рассматриваю 9:00: 00 000 в нерабочее время.

Тогда это другая тема, но стоит подчеркнуть, что cover? происходит от Comparable (например, time < now), в то время как include? происходит от Enumerable (например, включение в массив), поэтому я предпочитаю использовать cover? когда возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...