82 votes

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?

250voto

heathd Points 1376

En 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
 

64voto

DigitalRoss Points 80400

Utilisez ===

En fait, il existe déjà un opérateur qui le fera. Créez un Range et comparez les objets Time en utilisant l 'opérateur === .

 >> start = Time.now.to_i   
>> inside = Time.now.to_i      
>> range = start..Time.now.to_i
>> outside = Time.now.to_i
>> range === inside        => true
>> range === outside       => false
 

39voto

Aaron Points 2249

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
 

5voto

sorens Points 2835

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 facile. La partie importante est la méthode include_with_range? sur une plage.

3voto

cdmwebs Points 651

Si ce sont des horodatages:

 def in_progress?
  (start_time..end_time) .include? (Time.now)
fin 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X