Je cherche un moyen idiomatique pour faire passer le temps depuis une date donnée en heures, minutes et secondes.
Si la date indiquée est 2013-10-25 23:55:00 et la date actuelle est 2013-10-27 20:55:09, la valeur renvoyée doit être 45:03:09. Les gemmes time_difference et time_diff ne fonctionneront pas avec cette exigence.
Vous pouvez essayer avec ceci:
def time_diff(start_time, end_time)
seconds_diff = (start_time - end_time).to_i.abs
hours = seconds_diff / 3600
seconds_diff -= hours * 3600
minutes = seconds_diff / 60
seconds_diff -= minutes * 60
seconds = seconds_diff
"#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}:#{seconds.to_s.rjust(2, '0')}"
# or, as hagello suggested in the comments:
# '%02d:%02d:%02d' % [hours, minutes, seconds]
end
Et utilisez-le:
time_diff(Time.now, Time.now-2.days-3.hours-4.minutes-5.seconds)
# => "51:04:04"
time_diff = Time.now - 2.minutes.ago
Time.at(time_diff.to_i.abs).utc.strftime "%H:%M:%S"
=> "00:01:59"
Ou si votre application est difficile à arrondir, remplacez simplement to_i par round:
Time.at(time_diff.round.abs).utc.strftime "%H:%M:%S"
=> => "00:02:00"
Je ne suis pas sûr de la partie idiomatique
Mise à jour: si le décalage horaire devrait dépasser 24 heures, le code ci-dessus n'est pas correct. Si tel est le cas, on pourrait suivre la réponse de @MrYoshiji ou ajuster la solution ci-dessus pour calculer manuellement les heures à partir d'un objet datetime:
def test_time time_diff
time_diff = time_diff.round.abs
hours = time_diff / 3600
dt = DateTime.strptime(time_diff.to_s, '%s').utc
"#{hours}:#{dt.strftime "%M:%S"}"
end
test_time Time.now - 28.hours.ago - 2.minutes - 12.seconds
=> "27:57:48"
test_time Time.now - 8.hours.ago - 2.minutes - 12.seconds
=> "7:57:48"
test_time Time.now - 24.hours.ago - 2.minutes - 12.seconds
=> "23:57:48"
test_time Time.now - 25.hours.ago - 2.minutes - 12.seconds
=> "24:57:48"
Il existe une méthode pour cela:
Time.now.minus_with_coercion(10.seconds.ago)
est égal à 10 (en fait, 9,99 ..., utilisez .round
si vous voulez un 10).
Source: http://apidock.com/Rails/Time/minus_with_coercion
J'espère que j'ai aidé.
Regarder
comment convertir 270921sec en jours + heures + minutes + sec? (Ruby)
qui est très similaire à votre question, à partir de la différence en secondes