Tengo un evento con start_time
y end_time
quiero comprobar si el evento está "en curso". Eso sería verificar si la fecha de hoy está en el rango entre las dos fechas.
¿Cómo harías esto en una función?
===
De hecho, hay un operador que hará esto. Haga un Range
y compare Time
objetos con él usando el ===
operador.
start = Time.now.to_i
range = start..(start + 2)
inside = start + 1
outside = start + 3 # ok, now...
range === inside # true
range === outside # false
irb
ejemplo anterior también funcionó bien, pero el ejemplo interactivo no siempre se reprodujo correctamente en algunos experimentos. Éste es más fácil de cortar y pegar.
Todo está arreglado ahora.
.to_i
y luego usarlas===
para ver si están en el rango. En mi opinión,.coverage?
es una mejor solución para las fechas.En Ruby 1.9.2
===
no funciona, aparece un error: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>'
En su lugar use
#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
fuente
cover?
métodoDate
así(Date.yesterday..Date.tomorrow).cover?(Date.today) => true
===
funciona bien en Ruby 1.9.2. Acabas de olvidar el.to_i
Si está usando Rails, puede usar
TimeWithZone#between?
. Entonces tendrías algo como esto:> 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
fuente
Dado que la clase de fecha incluye el módulo Comparable, cada objeto de fecha tiene un
between?
método.require 'date' today = Date.today tomorrow = today + 1 one_month_later = today >> 1 tomorrow.between?(today, one_month_later) # => true
fuente
Si está utilizando Rails, puede intentar esto:
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
Nota: Acabo de usar
beginning_of_day
yend_of_day
para proporcionar un rango fácil. La parte importante es elinclude_with_range?
método en un rango.fuente
include_with_range
ya que no era un caso en el que se comparara un rango con un rango. Probablemente algún tipo de tumor cerebral. Buen partido, gracias @TylerRick. La respuesta de @heathd es realmente la mejor.Si son marcas de tiempo:
fuente
TypeError: can't iterate from Time
Se marca la fecha actual entre dos fechas. Usando 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
fuente
resumen
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
fuente