Respostas:
Com as classes Date (e DateTime), você pode fazer (end_date - start_date).to_i
para obter a diferença do número de dias.
Time
objetos retornam segundos embora.
Time
objetos, não a Date
objetos. Talvez você possa atualizar o nome no seu comentário para refletir que não são datas?
Supondo que end_date
e start_date
sejam de classe ActiveSupport::TimeWithZone
no Rails, você pode usar:
(end_date.to_date - start_date.to_date).to_i
(Time.zone.now.to_date - 23.hours.ago.to_date).to_i
, dá 1 e deve ser 0
Time.zone.now.to_date
retorna "Qua, 15 de novembro de 2017", enquanto 23.hours.ago.to_date
retorna "Ter, 14 de novembro de 2017". A diferença no número de dias é e deve ser 1, a menos que você tenha executado seu código na hora anterior à meia-noite.
O Rails tem alguns auxiliares integrados que podem resolver isso para você. Uma coisa a ter em mente é que isso faz parte dos Actionview Helpers, portanto eles não estarão disponíveis diretamente no console.
Tente isto
<% 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"
Eu continuava obtendo resultados em segundos, então isso funcionou para mim:
(Time.now - self.created_at) / 86400
1.day
não é o ruby
OP solicitado (em tags). É Rails
ou mais específico active support
que created_at
é, basicamente, um Model
método em Rails
tão ..
para obter o número de dias em um intervalo de tempo (apenas uma contagem de todos os dias)
(start_date..end_date).count
(start_date..end_date).to_a.size
#=> 32
para obter o número de dias entre 2 datas
(start_date...end_date).count
(start_date...end_date).to_a.size
#=> 31
Nenhuma das respostas anteriores (até a presente data) fornece a diferença correta em dias entre duas datas.
O que mais se aproxima é por esse dankent . Uma resposta completa seria convertida to_i
e depois dividida:
(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
No exemplo específico da pergunta, não se deve analisar Date
se o tempo passado é relevante. Use em Time.parse
vez disso.
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