web-dev-qa-db-fra.com

Comment savoir si la date d'aujourd'hui est dans une plage de dates?

J'ai un événement avec start_time et end_time et je veux vérifier si l'événement est "en cours". Ce serait pour vérifier si la date d'aujourd'hui est dans la plage entre les deux dates.

Comment feriez-vous cela dans une fonction?

75
Landitus

Utilisez ===


En fait, il y a un opérateur qui va le faire. Créez une Range et comparez-y des objets Time à l'aide de l'opérateur ===.

start   = Time.now.to_i

range   = start..(start + 2)
inside  = start + 1
outside = start + 3        # ok, now...

range === inside  # true
range === outside # false


Mise à jour post-comment-flood: Cette version fonctionne bien partout. (Dans Rails, en Ruby 1 et en Ruby 2.) L'exemple précédent, irb, fonctionnait également bien, mais l'exemple interactif n'était pas toujours reproduit correctement dans certaines expériences. Celui-ci est plus facile à couper-coller.

Tout est réglé maintenant. </ Sup>

54
DigitalRoss

Dans Ruby 1.9.2 === ne fonctionne pas, j'obtiens une erreur:

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>'

Utilisez plutôt #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
233
heathd

Si vous utilisez Rails, vous pouvez utiliser TimeWithZone#between?. Vous auriez alors quelque chose comme ceci:

> 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
33
Aaron

Comme la classe de date inclut le module Comparable, chaque objet de date a une méthode between?.

require 'date'

today           = Date.today
tomorrow        = today + 1
one_month_later = today >> 1

tomorrow.between?(today, one_month_later) # => true
14
steenslag

Si vous utilisez Rails, vous pouvez essayer ceci:

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 

Remarque: je viens d'utiliser beginning_of_day et end_of_day pour fournir une plage simple. La partie importante est la méthode include_with_range? sur une plage.

5
sorens

Si ce sont des horodatages:

def in_progress? 
 (start_time..end_time) .include? (Time.now) 
 end
4
cdmwebs

Checked est la date du jour entre deux dates. Utiliser 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
1
Dinesh Vaitage

résumé

  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
0
srghma