Respuestas:
Con las clases Date (y DateTime) puede hacer (end_date - start_date).to_i
para obtener el número de días de diferencia.
Time
Sin embargo, los objetos devuelven segundos.
Time
objetos, no a Date
objetos. ¿Quizás podría actualizar los nombres en su comentario para reflejar que no son fechas?
Asumiendo eso end_date
y start_date
ambos son de clase ActiveSupport::TimeWithZone
en Rails, puede usar:
(end_date.to_date - start_date.to_date).to_i
(Time.zone.now.to_date - 23.hours.ago.to_date).to_i
, da 1 y debería ser 0
Time.zone.now.to_date
devuelve "Mié, 15 de noviembre de 2017", mientras que 23.hours.ago.to_date
devuelve "Mar, 14 de noviembre de 2017". La diferencia en el número de días es y debe ser 1 a menos que haya ejecutado su código en la hora anterior a la medianoche.
Rails tiene algunos ayudantes integrados que pueden resolver esto por usted. Una cosa a tener en cuenta es que esto es parte de los Actionview Helpers, por lo que no estarán disponibles directamente desde la consola.
Prueba esto
<% start_time = "2012-03-02 14:46:21 +0100" %>
<% end_time = "2012-04-02 14:46:21 +0200" %>
<%= distance_of_time_in_words(start_time, end_time) %>
"about 1 month"
Seguí obteniendo resultados en segundos, así que esto funcionó para mí:
(Time.now - self.created_at) / 86400
1.day
no es ruby
como OP solicitado (en las etiquetas). Es Rails
, o más específico active support
, aunque created_at
es básicamente un Model
método en el Rails
modo ..
para obtener el número de días en un rango de tiempo (solo un recuento de todos los días)
(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
para obtener el número de días entre 2 fechas
(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
Ninguna de las respuestas anteriores (a esta fecha) da la diferencia correcta en días entre dos fechas.
El que más se acerca es aquel quequent . Una respuesta completa convertiría to_i
y luego dividiría:
(Time.now.to_i - 23.hours.ago.to_i) / 86400
>> 0
(Time.now.to_i - 25.hours.ago.to_i) / 86400
>> 1
(Time.now.to_i - 1.day.ago.to_i) / 86400
>> 1
En el ejemplo específico de la pregunta, no se debe analizar Date
si el tiempo transcurrido es relevante. Usar en su Time.parse
lugar.
def business_days_between(date1, date2)
business_days = 0
date = date2
while date > date1
business_days = business_days + 1 unless date.saturday? or date.sunday?
date = date - 1.day
end
business_days
end