117


39

Rubyで年齢を取得する

誕生日から年齢を取得したいのですが。 「今-誕生日/ 365」は機能しません。何年かは366日です。 私は次のようなコードを思い付きました。

now = Date.today
year = now.year - birth_date.year

if (date+year.year) > now
  year = year - 1
end

年齢を計算するためのもっとRuby的な方法はありますか?

21 Answer


398


私はここでパーティーに遅刻することを知っていますが、うるう年に2月29日に生まれた誰かの年齢を解決しようとするときに受け入れられた答えはひどく壊れるでしょう。 これは、 `+ birthday.to_date.change(:year ⇒ now.year)+`の呼び出しが無効な日付を作成するためです。

代わりに次のコードを(Railsプロジェクトで)使用しました。

def age(dob)
  now = Time.now.utc.to_date
  now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
end


48


私はこの解決策がうまく機能し、他の人々にとって読みやすいものであることを発見しました:

age = Date.today.year  -  birthday.year age  -  = Date.today <birthday age.yearsの場合、誕生日前の日数= 1

簡単で、うるう年などの処理について心配する必要はありません。


34


これを使って:

今すぐdef age = Time.now.utc.to_date now.year  -  birthday.year  - (birthday.to_date.change(:year => now.year)> now? 1:0)終わり


16


Ruby on Rails(ActiveSupport)の1つのライナー。 うるう年、うるう秒などを処理します。

def age(birthday)
  (Time.now.to_s(:number).to_i - birthday.to_time.to_s(:number).to_i)/10e9.to_i
end

〜両方の日付が同じタイムゾーンにあると仮定し、両方で `+ to_s()`の前に ` utc()+`を呼び出さない場合〜


9


(Date.today.strftime( '%Y%m%d')。to_i  -  dob.strftime( '%Y%m%d')。to_i)/ 10000


6


今のところ答えはちょっと変です。 あなたの最初の試みは、これを行う正しい方法にかなり近いものでした。

birthday = DateTime.new(1900, 1, 1)
age = (DateTime.now - birthday) / 365.25 # or (1.year / 1.day)

小数の結果が得られるので、 `+ to_i +`を使用して結果を整数に変換してください。 これは、日付の違いを、イベント以降の日数(または関連するTimeクラスの場合は秒)で測定された期間として正しく処理するため、より良い解決策です。 それから年の日数による単純な分割はあなたに年齢を与えます。 このようにして年数を計算する場合、元のDOB値を保持している限り、うるう年については考慮する必要はありません。


6


私のおすすめ:

def年齢(誕生日)((Time.now  -  birthday.to_time)/(60 * 60 * 24 * 365))フロア終了

秘訣は、Timeを使ったマイナス演算が秒を返すことです。


4


私はこれが好きです:

now = Date.current age = now.year  -  dob.year age  -  = 1ならnow.yday <dob.yday


4


https://stackoverflow.com/a/11427145/538534[この回答]が一番です。

'' '' '

私は@ philnashの解決策が好きですが、条件はもっとコンパクトかもしれません。 そのブール式が行うことは lexicographic orderを使用して[月、日]のペアを比較することです。そのため、代わりにrubyの文字列比較を使用することができます。

def age(dob)now = Date.today now.year  -  dob.year  - (now.strftime( '%m%d')<dob.strftime( '%m%d')? 1:0)終わり


2


これは この答えの変換です(これはたくさんの投票を受けています):

#日付をyyyymmdd形式に変換する今日=(Date.current.year * 100 Date.current.month)* 100 Date.today.day dob =(dob.year * 100 dob.month)* 100 dob.day#注: `.strftime( '%Y%m%d')も使用してください。to_i`

#年数に変換しますyears_old =(今日 -  dob)/ 10000

それはそのアプローチにおいて絶対にユニークですが、あなたがそれが何をするのか理解するとき完全に理にかなっています:

今日= 20140702#2 2014年7月2日

昨年この年生まれの#人は1歳です=(今日 -  20130702)/ 10000

1年前に生まれた#人はまだ0歳です= =(今日 -  20130703)/ 10000

#今日生まれた人は0歳=(今日 -  20140702)/ 10000#今日生まれた人は0歳

#うるう年に生まれた人(例: 1984)うるう年以外の年との比較=(20140228  -  19840229)/ 10000#29  - うるう年の赤ちゃんがいると思っていても通年はまだ経過していません。 (20140301  -  19840229)/ 10000#30

#うるう年に生まれた人(例: 1984)うるう年との比較(例: 2016)年=(20160229  -  19840229)/ 10000#32