2012-05-01 4 views
0

私はChris PineのRubyの本を使って作業しています。私のコードがうまくいかない理由は少し混乱しています。 、なぜハッシュ値にTimeクラスを使用するにはどうすればよいですか?

hash = {} 

File.open('birthdays.txt', "r+").each_line do |line| 
    name, date = line.chomp.split(/, */, 2) 
    hash[name] = date 
end 

puts 'whose birthday would you like to know?' 

name = gets.chomp 
puts hash[name]          
puts Time.local(hash[name]) 

私の質問は次のように

Andy Rogers, 1987, 02, 03 

など

マイコード:

私は似ているテキストの周りに10行を持っていbirthdays.txtと呼ばれるファイルを持っていますコードの最後の行、Time.local(hash[name])はこの出力を生成しますか?:

1987-01-01 00:00:00 +0000 

の代わり:

1987-02-03 00:00:00 +0000 

答えて

0
line = "Andy Rogers, 1987, 02, 03\n" 
name, date = line.chomp.split(/, */, 2) #split (', ', 2) is less complex. 
#(Skipping the hash stuff; it's fine) 
p date #=>   "1987, 02, 03" 
# Time class can't handle one string, it wants: "1987", "02", "03" 
# so: 
year, month, day = date.split(', ') 
p Time.local(year, month, day) 
# or do it all at once (google "ruby splat operator"): 
p Time.local(*date.split(', ')) 
+0

すばらしい回答の人に感謝します!どちらも非常に役に立ちます。私はテキストファイルから '行'を見つけなければならないので、どうすればそれを使うことができますか? File.open( 'birthdays.txt'、 "r +")。each_line do | line |ローカル変数の日付が使用できなくなってしまいます。 – dodgerogers747

2

あなたはTime.localのドキュメントを見れば、

Time.localは、文字列を解析しません。年、月、日の別々のパラメータを渡すことを期待しています。 "1987,02,03"のような文字列を渡すと、それが単一のパラメータである年になります。次に、その文字列を整数に強制しようとします。この場合は1982です。

したがって、基本的に、その文字列を年、月、日にスライスしたいとします。これを行うには複数の方法があります。ここで1は

year, month, date = date.split(/, */).map {|x| x.to_i} 
Time.local(year, month, date) 
+0

これに感謝して、私はちょうどコードが働いて、brill! Andy – dodgerogers747

0
hash = {} 


File.open('birthdays.txt').each_line do |line| 
    line = line.chomp 
    name, date = line.split(',',2) 
    year, month, day = date.split(/, */).map {|x| x.to_i} 
    hash[name] = Time.local(year, month, day) 
end 

puts 'Whose birthday and age do you want to find out?' 
name = gets.chomp 

    if hash[name] == nil 
     puts ' Ummmmmmmm, dont know that one' 
    else 
     age_secs = Time.new - hash[name] 
     age_in_years = (age_secs/60/60/24/365 + 1) 

    t = hash[name] 
    t.strftime("%m/%d/%y") 
    puts "#{name}, will be, #{age_in_years.to_i} on #{t.strftime("%m/%d/")}" 
end 

は、以前のプログラムでTime.localコールを移動しなければならなかったし、その後ビンゴ、歓声の男(それは短くすることができるが、これは最も明確な方法である)です!

関連する問題