¿Cómo crear una propiedad de tiempo que siempre esté 24 horas por detrás de la hora actual?

Estoy creando un objeto de tiempo, que uso para recopilar toda la información de las últimas 24 horas, no tengo problemas para crear el objeto que muestra la hora actual. Pero no estoy seguro de cómo configurarlo exactamente 24 horas en el pasado, sin tener la zona horaria adjunta.

  def set_time
     @past_time = Time.now.to_s(:db) - 1.days
  end

Formato de salida esperado:

 "2021-11-29 09:15:17"

Resultado:

 undefined method `-' for "2021-11-29 10:19:46":String
Answer

Está restando el tiempo del objeto de cadena a medida que lo convirtió Time.nowen la cadena usando to_s.

En lugar de usted puede hacer esto

(Time.new - 1.days).to_s(:db)

Nota: Obtendrá múltiples formas de lograr estos rieles. Puede mejorar la legibilidad del código y la comprensión del código haciendo esto.

Ejemplo:

DateTime.now.days_ago(1)

Lo más fácil que se me ocurre sería:

24.hours.ago.to_s(:db)

Tenga en cuenta que la hora devuelta sería UTC por defecto en este caso.

Puede utilizar DateTime#advancedesde ActiveSupport:

Time.current.advance(hours: -24)
# or 
Time.current.advance(days: -1)

Tenga en cuenta que en las zonas horarias que usan DST, un día no siempre es de 24 horas, por lo que los dos no son realmente equivalentes. También puede usar los métodos que ActiveSupport::Duration monkey parchea en Integer:

24.hours.ago
1.day.ago

Sin embargo, esto siempre usa su zona horaria predeterminada.