2017-10-05 8 views
0

私は最も近い日付を表示しようとしています。配列/ハッシュから月と日を表示する

def closest_birthdate(birthdates) 
    sorted_dates = birthdates.sort_by do |_, value| 
    (DateTime.parse(value) - DateTime.now).abs 
    end 
    name, birthday = sorted_dates.first 
    "#{name} has his birthday on #{birthday} " 
end 

hash = { 
    'William' => '2017-09-05', 
    'Henk' =>  '2017-10-12', 
    'Richard' => '2017-10-10', 
} 
closest_birthdate(hash) 

出力は次のとおりです:私は、次のコードを持っている

"William has his birthday on 2017-10-5" 

方法次のように私は月と日を表示することができますか?

"William has his birthday on 10-5" 

私はハッシュで年を削除しようとしましたが、私はそれを行うとコードがもう日付を認識しないと思います。あなたの代わりに `Date`インスタンスの文字列として日付を格納なぜ

+2

を試してみてください? – Stefan

+2

ところで、歴史的な日付を扱っているのでなければ、 'DateTime'ではなく' Time'を使うべきです(時間部分が不要な場合は 'Date'だけです)。 [いつ 'DateTimeを使うべきですか?]と' Time'をいつ使うべきですか?](http://ruby-doc.org/stdlib-2.4.2/libdoc/date/rdoc/DateTime.html#class-DateTime- – Stefan

+2

もう1つの "BTW" - 誕生日は、通常、今年ではなく生まれた年を使って保存されます。これにより、最も近い日付を見つけるのが少し難しくなりますが、それははるかに便利です(年齢)。また、 'nearest_birthdate'は、それらが最も近い場合、最終的に過去の日付を返します。おそらく次の(つまり将来の)誕生日に興味があります。 – Stefan

答えて

5

はこの1

require 'date' 

"#{name} has his birthday on #{Date.parse(birthday).strftime('%m-%d')}" 
+1

ここにはいくつかの[documentation](https://ruby-doc.org/core-2.2.0/Time.html#method-i-strftime)があります。彼らはあなたが夢中になりたい場合は、多くのフォーマットオプションを表示します。 – user3366016

+1

@Doepleこれは、ハッシュを作成するときに日付を文字列にしたからです。 #strftimeはTime/Dateオブジェクトで動作します。 ursusの新しい答えはそれをDateに解析します。 – user3366016

+1

必要な 'require's(' require 'date'')を表示するRuby(askerを含む)の新しい読者には便利です。また、[Date :: parse](http://ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/Date.html#method-c-parse)が危険を伴います: Date.parse( "09 cat lives")#=># ' [Date :: strptime](http://ruby-doc.org/stdlib-2.4.0/libdoc/date/rdoc/Date.html#method-c-strptime)はより安全です: 'Date.strptime( '2017 -07-23 '、'%Y-%m-%d ')#=>#<日付:2017-07-23((2457958j、0s、0n)、+ 0s、2299161j)> –