2009-08-06 12 views
1

私はこれより良い "distance_of_time_in_words"を作成しようとしています。これまではhttp://github.com/radar/dotiwでした。2つの間の距離を計算する

しかし、現時点では、仕様で示されているように、数ヶ月+数年で窒息する。私は完全な損失に!助けて?パックスによって追加

コードはそう誰-1はgithubのを検索しなければならない:私たちはあまりにも完全な損失で

module ActionView 
    module Helpers 
    module DateHelper 
     def distance_of_time_in_words_hash(from_time, to_time) 
     output = HashWithIndifferentAccess.new 
     from_time = from_time.to_time if from_time.respond_to?(:to_time) 
     to_time = to_time.to_time if to_time.respond_to?(:to_time) 
     distance = from_time - to_time 

     # Get a positive number. 
     distance *= -1 if distance < 0 

 

 while distance > 0 
      if distance > 100000000000000 
      elsif distance >= 31449600 
      output[I18n.t(:years, :default => "years")], distance = 
       distance.divmod(31449600) 
      elsif distance >= 2419200 
      output[I18n.t(:months, :default => "months")], distance = 
       distance.divmod(2419200) 
      elsif distance >= 604800 
      output[I18n.t(:weeks, :default => "weeks")], distance = 
       distance.divmod(604800) 
      elsif distance >= 86400 
      output[I18n.t(:days, :default => "days")], distance = 
       distance.divmod(86400) 
      elsif distance >= 3600 
      output[I18n.t(:hours, :default => "hours")], distance = 
       distance.divmod(3600) 
      elsif distance >= 60 
      output[I18n.t(:minutes, :default => "minutes")], distance = 
       distance.divmod(60) 
      else 
      output[I18n.t(:seconds, :default => "seconds")] = distance.to_i 
      distance = 0 
      end 
     end 
     output 
     end 

 

 def distance_of_time_in_words(from_time, to_time, include_seconds = false, 
      options = {}, output_options = {}) 

     hash = distance_of_time_in_words_hash(from_time, to_time) 
     hash.delete(:seconds) if !include_seconds 

     # Remove all the values that are nil. 
     time_measurements = [ 
      I18n.t(:years, :default => "years"), 
      I18n.t(:months, :default => "months"), 
      I18n.t(:weeks, :default => "weeks"), 
      I18n.t(:days, :default => "days"), 
      I18n.t(:hours, :default => "hours"), 
      I18n.t(:minutes, :default => "minutes"), 
      I18n.t(:seconds, :default => "seconds")].delete_if do |key| 
      hash[key].nil? 
     end 

     output = [] 
     time_measurements.each do |key| 
      name = hash[key] > 1 ? key : key.singularize 
      output += ["#{hash[key]} #{name}"] 
     end 

     output.to_sentence(output_options) 
     end 
    end 
    end 
end 
+2

「距離」ではなく「差」でなければなりませんか? たぶん、私はそれほど時間がかからないことがあります:) –

答えて

2

あなたが適用されるすべての単位で時間差を取得しようとしているように見えます(すなわち。「2年、4ヶ月、7日間」の代わりに、Railsのdistance_of_time_in_wordsが与える「2年」)?

もしそうなら、In Rails, display time between two dates in English、時差の表示に関するもう1つの質問をチェックしてください。私の答えは、あなたがやろうとしているようなものの出発点となり、時間、分、秒を含めるようにメソッドを拡張することは難しくありません。

+0

私はすでに持っていたものと非常によく似ていますが、正しい結果は得られませんが、数値ヘルパーとマジックナンバーを使用する方法が好きです。 –

2

です。おそらく、あなたが私たちのがによって容易に住んで作ることができる:(1)(それは大きくはないのです)、コードを掲示

  • [これを忘れて、私はあなたのためにそれをやりました]。
  • (2)正確にはを教えてください(希望の出力)。
  • (3)取得した動作(実際の出力例)を教えてください。

次に、より良い仕事をすることができます。

私はまっすぐに気付いたことの1つは、ではなく、は2,419,200秒で、2月以外の任意の月(閏年でない場合のみ)です。同様に、年には364日間はありません。

私はあなたがどのように間隔を計算しているのか考え直す必要があると思います。

期間の「言葉」バージョンが少し不正確さを処理できると仮定すると、最低限、これらの数値の平均値を使用する必要があります(年間が365.2425日で十分です目的:

  • 1年は31,556,952秒です。
  • 1ヶ月は2,629,746秒(12で簡単に除算)です。
+0

正しい動作が仕様ファイルに記述されています。エラーは、スペックファイルを実行することによって取得できます。 –

+2

私は、ここにあなたのすべてのもの*を載せてくださいという意見があります。これらのサイトが投資を収益化する際に、tinyurlやgithubの共有を参照する無数の質問と回答はどうなりますか?正直言って、ウィキペディアの場合でも、これは当てはまることではありません。スペックファイルを実行するだけでいいというコメントをいただければ、より多くの*あなた*が*置かれていることがわかります。あなたがここにすべてを載せて、実際には「スペックファイルを実行する」というよりむしろ問題が何であるかを説明したほうがはるかに簡単でした。 – paxdiablo

関連する問題