2017-06-10 8 views
0

私はRubyの方が新しいので、ハッシュで値を取得して日、時間、分に変換する方法を理解しようとしています。基本的に私がやろうとしているのは、将来の時間を作成してDateTime.nowに追加することです。ただし、残念ながら、日、時間、および分の変換はミリ秒単位で表示されます。私が期待するものではない。Rubyは変数値から日、時間、分を取得します

コード

puts "date_hash #{date_hash}" 
puts "days #{date_hash['days']} - #{date_hash['days'].days}" 
puts "hours #{date_hash['hours']} : #{date_hash['hours'].hours}" 
puts "minutes #{date_hash['minutes']} : #{date_hash['minutes'].minutes}" 

# below will not work (yet) until above is correct 
# future = date_hash['days'].days + date_hash['hours'].hours + date_hash['minutes'].minutes 
# end_date = DateTime.now + future 

出力:

date_hash {"days"=>27, "hours"=>1, "minutes"=>13} 
days 27 - 2332800 # would expect 27.days 
hours 1 : 3600 # would expect 1.hour 
minutes 13 : 780 # would expect 13.minutes 

すべてのヘルプははるかに高く評価されます。

答えて

1
days 27 - 2332800 # would expect 27.days 
hours 1 : 3600 # would expect 1.hour 
minutes 13 : 780 # would expect 13.minutes 

2332800 27.daysです。内部的には、すべての継続時間は秒単位で表されます(したがって、それらの計算を行うことができます)。補間にdurationを使用すると暗黙の.to_s呼び出しがあり、これを文字列に変換します。これをチェックしてください:

27.days # => 27 days 
27.days.to_s # => "2332800" 
+0

ああ。それは今より多くの意味があります。どうも! –

1

レールは正しい日付を取得する必要があります。私が間違っているのは、文字列(date_hash ['days'])ではな​​くシンボル(date_hash [:days])でハッシュにアクセスしようとしていることだけです。また、コードを実行するときに得られる出力が何であるかを知るのに役立ちます。

0

これは純粋なRubyソリューションです。 Railsの日時メソッドを使用するより良い方法があるかもしれません。

require 'time' 

def fast_forward(date_hash) 
    Time.at(Time.now + 60 * 
    (60 * (24 * date_hash["days"] + date_hash["hours"]) + date_hash["minutes"])) 
end 

date_hash = {"days"=>27, "hours"=>1, "minutes"=>13} 

Time.now 
    #=> 2017-06-09 22:43:33 -0700 
new_time = fast_forward(date_hash) 
    #=> 2017-07-06 23:56:35 -0700 

時オブジェクトnew_timeは、関心(年、週、時間、分、などの日)の情報を抽出するために、クラスTimeのメソッドで使用することができます。

時間は、エポックから秒として内部的に保存されます。私は以下の手順を実行しました。

  • を表す(それだけには等しくない)こと(Timeの)インスタンスを取得するためにエポックからの秒数をクラスメソッドTime::nowを用います。
  • インスタンスメソッドTime#+が呼び出され、時間オブジェクトが秒に変換され、その引数にも秒が追加され、秒が返されます(エポック以降)。
  • は、Time::atクラスメソッドを使用してこの合計をTimeインスタンスに変換して戻します。
関連する問題