Tengo un evento con start_timey end_timequiero 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?
Respuestas:
===De hecho, hay un operador que hará esto. Haga un Rangey compare Timeobjetos 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
irbejemplo 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_iy 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
cover?método
Dateasí(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
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
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_dayy end_of_daypara proporcionar un rango fácil. La parte importante es el include_with_range?método en un rango.
include_with_rangeya 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:
def in_progress? (hora_inicio..hora_final) .incluir? (Hora.hora) fin
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
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