strf rails now ruby date time

rails - Compruebe si dos marcas de tiempo son el mismo día en Ruby



time ruby (4)

ActiveSupport define el buen método to_date para Time clase Time . Así es como se ve:

class Time def to_date ::Date.new(year, month, day) end end

Al usarlo puedes comparar marcas de tiempo como esa:

Time.at(ts1).to_date === Time.at(ts2).to_date

Y aquí hay una forma menos controvertida sin extender Time clase de Time :

t1 = Time.at(ts1) # local time corresponding to given unix timestamp ts1 t2 = Time.at(ts2) Date.new(t1.year, t1.month, t1.day) === Date.new(t2.year, t2.month, t2.day)

Estoy un poco confundido entre Date, Datetime y Time en Ruby. Es más, mi aplicación es sensible a las zonas horarias, y no estoy seguro de cómo convertir entre estas tres mientras sea robusto en la zona horaria.

¿Cómo puedo verificar si dos marcas de tiempo de Unix (segundos desde época) representan el mismo día? (En realidad, no me importa si usa la hora local o UTC; aunque prefiero la hora local, siempre que sea consistente, puedo diseñar eso).


Podemos usar beginning_of_day de la hora y compararlos: t1.beginning_of_day == t2.beginning_of_day esta forma las zonas horarias no se verán afectadas.


Usando la biblioteca estándar, convierta un objeto Time en una Fecha.

require ''date'' Time.at(x).to_date === Time.at(y).to_date

La fecha tiene el método === que será verdadero si dos objetos de fecha representan el mismo día.


Time.at(ts1).day == Time.at(ts2).day && (ts1 - ts2).abs <= 86400

O

t1 = Time.at(ts1) t2 = Time.at(ts2) t1.yday == t2.yday && t1.year == t2.year

En el primer caso, nos aseguramos de que las marcas de tiempo no sean más largas que un día (porque #day devuelve el día del mes y sin este control adicional, el 1 de abril sería igual al 1 de mayo)

Una alternativa es tomar el día del año y asegurarse de que sean del mismo año.

Estos métodos funcionan igual de bien en 1.8 y 1.9 :-)