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?
Respuestas:
===
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
cover?
método
Date
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
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_day
y end_of_day
para proporcionar un rango fácil. La parte importante es el include_with_range?
método en un rango.
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:
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