it-swarm.com.de

Wie kann ich feststellen, ob das heutige Datum in einem Datumsbereich liegt?

Ich habe ein Ereignis mit start_time und end_time und möchte überprüfen, ob das Ereignis "in Bearbeitung" ist. Das wäre zu überprüfen, ob das heutige Datum im Bereich zwischen den beiden Datumsangaben liegt.

Wie würdest du das in einer Funktion machen?

75
Landitus

Verwenden Sie ===


Tatsächlich gibt es einen Operator, der dies tut. Erstellen Sie eine Range und vergleichen Sie Time-Objekte mit dem ===-Operator.

start   = Time.now.to_i

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

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


Update post-comment-flood: Diese Version funktioniert überall gut. (In Rails, in Ruby 1 und in Ruby 2.) Das frühere irb-Beispiel funktionierte gut, aber das interaktive Beispiel wurde in einigen Experimenten nicht immer korrekt reproduziert. Dieses ist einfacher zu schneiden und einzufügen.

Jetzt ist alles klarer. </ Sup>

54
DigitalRoss

In Ruby 1.9.2 funktioniert === nicht, ich erhalte eine Fehlermeldung:

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

Verwenden Sie stattdessen #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

Wenn Sie Rails verwenden, können Sie TimeWithZone#between? verwenden. Sie hätten dann so etwas wie:

> 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

Da die Datumsklasse das Comparable-Modul enthält, verfügt jedes Datumsobjekt über eine between?-Methode.

require 'date'

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

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

Wenn Sie Rails verwenden, können Sie Folgendes versuchen:

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 

Hinweis: Ich habe gerade beginning_of_day und end_of_day verwendet, um einen einfachen Bereich bereitzustellen. Der wichtige Teil ist die include_with_range?-Methode für einen Bereich.

5
sorens

Wenn es sich um Zeitstempel handelt:

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

Aktiviert ist das aktuelle Datum zwischen zwei Datumsangaben. Ruby verwenden

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

zusammenfassung

  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