Как узнать, находится ли сегодняшняя дата в диапазоне дат?
у меня есть с start_time
и end_time
и хотите проверить, если событие "в работе". Это было бы проверить, находится ли сегодняшняя дата в диапазоне между двумя датами.
Как бы вы это сделали в функции?
8 ответов:
использовать
===
на самом деле, есть оператор, который будет делать это. Сделайте
Range
и сравниваемTime
объекты с помощью===
оператора.start = Time.now.to_i range = start..(start + 2) inside = start + 1 outside = start + 3 # ok, now... range === inside # true range === outside # false
обновить пост-комментарий-флуд: эта версия хорошо работает везде. (В Rails, в Ruby 1 и в Ruby 2.) Чем раньшеirb
пример также работал нормально, но интерактивный пример не всегда воспроизводился правильно в некоторых экспериментах. Это легче вырезать и вставить.теперь все улажено.
В Ruby 1.9.2
===
не работает, я получаю сообщение об ошибке:irb(main):019:0> (Time.now .. (Time.now+1)) === Time.now TypeError: can't iterate from Time from (irb):19:in `each' from (irb):19:in `include?' from (irb):19:in `include?' from (irb):19:in `===' from (irb):19 from /opt/ruby192/bin/irb:12:in `<main>'
вместо того, чтобы использовать
#cover?
:irb(main):002:0> (Time.now..Time.now+4).cover?(Time.now) => true irb(main):003:0> (Time.now..Time.now+4).cover?(Time.now+10) => false
Если вы используете рельсы, вы можете использовать
TimeWithZone#between?
. Тогда у вас будет что-то вроде этого:> start_time = Time.zone.parse('12pm') => Thu, 26 Jul 2012 12:00:00 EDT -04:00 > end_time = start_time + 1.hour => Thu, 26 Jul 2012 13:00:00 EDT -04:00 > inside = Time.zone.parse('12:30pm') => Thu, 26 Jul 2012 12:30:00 EDT -04:00 > outside = Time.zone.parse('1:30pm') => Thu, 26 Jul 2012 13:30:00 EDT -04:00 > inside.between?(start_time, end_time) => true > outside.between?(start_time, end_time) => false
поскольку класс date включает в себя сопоставимый модуль, каждый объект date имеет
between?
метод.require 'date' today = Date.today tomorrow = today + 1 one_month_later = today >> 1 tomorrow.between?(today, one_month_later) # => true
если вы используете рельсы, вы можете попробовать это:
ruby-1.8.7-p299 :015 > a = DateTime.now => Fri, 02 Dec 2011 11:04:24 -0800 ruby-1.8.7-p299 :016 > (a.beginning_of_day..a.end_of_day).include_with_range? a => true ruby-1.8.7-p299 :017 > (a.beginning_of_day..a.end_of_day).include_with_range? a+10.days => false ruby-1.8.7-p299 :018 > (a.beginning_of_day..a.end_of_day).include_with_range? a+25.hours => false ruby-1.8.7-p299 :019 > (a.beginning_of_day..a.end_of_day).include_with_range? a+2.hours => true
примечание: Я только что использовал
beginning_of_day
иend_of_day
обеспечить легкий ряд. Важной частью являетсяinclude_with_range?
метод на выбор.
проверить сейчас между двумя датами. Используя Ruby
currentDate = DateTime.now start_date = "2017-03-31" end_date = "2018-03-31" currentDate.between?(start_date, end_date) **Out Put Will be** true or false
резюме
d1 = DateTime.parse('2018/04/01') d2 = DateTime.parse('2018/04/29') outside = DateTime.parse('2018/04/30') inside = DateTime.parse('2018/04/15') # include? (d1...d2).include?(d1) # true (d1...d2).include?(d2) # false (d1...d2).include?(outside) # false (d1...d2).include?(inside) # true (d1..d2).include?(d1) # true (d1..d2).include?(d2) # true (d1..d2).include?(outside) # false (d1..d2).include?(inside) # true # === (d1...d2) === d1 # true (d1...d2) === d2 # false (d1...d2) === outside # false (d1...d2) === inside # true (d1..d2) === d1 # true (d1..d2) === d2 # true (d1..d2) === outside # false (d1..d2) === inside # true # cover? (d1...d2).cover?(d1) # true (d1...d2).cover?(d2) # false (d1...d2).cover?(outside) # false (d1...d2).cover?(inside) # true (d1..d2).cover?(d1) # true (d1..d2).cover?(d2) # true (d1..d2).cover?(outside) # false (d1..d2).cover?(inside) # true # between? d1.between?(d1, d2) # true d2.between?(d1, d2) # true outside.between?(d1, d2) # false inside.between?(d1, d2) # true