web-dev-qa-db-fra.com

Rails - Obtenez le décalage horaire en heures, minutes et secondes

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.

25
anon

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"
38
MrYoshiji
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" 
28
Tumas

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é.

7
Francois

Regarder

comment convertir 270921sec en jours + heures + minutes + sec? (Ruby)

qui est très similaire à votre question, à partir de la différence en secondes

4
Danny