2009-07-23 11 views
1

J'ai un certain nombre de fichiers CSV qui contiennent les heures de début et de fin. Je peux utiliser FasterCSV pour analyser les fichiers, mais je ne connais pas le meilleur moyen d'obtenir la durée dans Ruby. Voici les valeurs de mon hash générées pour chaque ligne des fichiers CSV.Ruby: comment calculer une durée donnée 2 fois à partir d'un fichier CSV?

start time: Mon Jul 20 18:25:17 -0400 2009 
end time: Mon Jul 20 18:49:43 -0400 2009 

Répondre

2

Vous pouvez obtenir la durée en soustrayant un DateTime d'un autre. Vous obtiendrez des objets DateTime de FasterCSV aussi longtemps si vous incluez le convertisseur: date_time. Par exemple:

FasterCSV.foreach(some_file, :converters => [:date_time]) do |row| 
    #blah 
end 

Ou, vous pouvez simplement les convertir vous-même en utilisant DateTime # parse. De là, vous pouvez utiliser Date#day_fraction_to_time pour obtenir un tableau contenant [hours, minutes, seconds, fraction_of_a_second], ce qui je pense est plus facile à travailler que la fraction de la journée.

Selon la façon dont vous souhaitez les afficher, il y a probablement des informations qui vous aideront dans le answers of this question. Ces réponses sont pour Rails, mais vous pouvez toujours inclure les parties nécessaires à partir de Rails, ou simplement regarder la source des fonctions (disponible dans la documentation de Rails) pour voir comment elles le font. C'est assez explicite.

3

Vous ne savez pas si c'est le «meilleur», mais vous pouvez utiliser par ex. Classe DateTime pour cela:

require 'date' 

d1 = DateTime.parse("Mon Jul 20 18:25:17 -0400 2009") 
d2 = DateTime.parse("Mon Jul 21 18:25:17 -0400 2009") 

puts "Duration is #{(d2-d1).to_f} days" 
+1

Alors que la classe DateTime est OK, il y a aussi '' time.rb' 'qui étend la classe Time standard. Il ne gère pas l'ambiguïté et ne supporte pas les différents calendriers, il est donc beaucoup plus léger. La syntaxe est la même ('Time.parse()') – hhaamu

+0

Addendum: t2 -t1 renvoie l'intervalle en secondes. – hhaamu

+0

Peut-être. J'ai juste tendance à utiliser DateTime parce que ça a l'air d'être plus intelligent à propos de ce qu'il fait que Time, et c'est le plus gros point pour moi quand je choisis Ruby par rapport à d'autres langues. –