質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

2834閲覧

誕生日から年齢を取得。

tkshp

総合スコア174

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/12/16 05:31

前提・実現したいこと

誕生日と今日の日付から年齢を算出したいのですが、どのようにすればよいでしょうか?
できれば、なるべく簡単に実装したいので、Dateクラスを使う方法でお願いします
(それよりも簡単な実装法があれば、Dateクラスにこだわりません)。
ご教示お願いします。

試したこと

Ruby

1 # 1970-01-01のような書式の文字列で受け取る。 2 def getAge(birthday) 3 unless birthday.length == 10 && birthday.include?("-") then 4 return false 5 end 6 begin 7 birthday = Date.parse(birthday) 8 rescue 9 return false 10 end 11 today = Date.today 12 diff = today - birthday 13 diff.to_i / 365 14 end

これで実装できたと思ったのですが、よく考えたら一律で365で割っているので、うるう年が考慮されていないことに気づきました。
うるう年を考慮したコードを書くと、なかなか長くなるので、もっと手軽な方法ってありますか?

補足情報(FW/ツールのバージョンなど)

ruby 2.6.5p114
Rails 6.0.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

日本の法律上(年齢計算に関する法律)は、年を取るのを
「誕生日の前日が終了した瞬間」(≠誕生日を迎えた瞬間。法律上は誕生日の前日の24時で、これは誕生日の前日に含まれると解釈される)と定義しています。
こうすることで 2/29 生まれの人の年齢が平年でも正しく定義されるわけです。
※2/29 の前日=2/28 が終わった瞬間に年を取る、ので、2/28 の翌日である 3/1 には1才年を取っているわけです

が……法律の条文上で「日」と書かれている場合、時刻を加味しないため、誕生日の前日時点を指す(上で書いたように24時は前日に含まれると解釈されるため)ことになっています。ややこしいですね。

で……ちょっと裏技に近いですが、現在年月日(YMD)と誕生日(ymd)について、

YYYYMMDD - yyyymmdd ------------ aaaabbcc

数値変換して計算すると、aaaa の部分が年齢になります。多分これがいちばん楽。
例:2000/02/29 生まれの人で、

20190228 20190301 - 20000229 - 20000229 ------------ ------------- 189999 190072

で、まあ上手く処理されてくれます。上に書いたように「日」であればちょっと面倒な対応が必要になります(といっても、誕生日を一日前にずらして計算すればよいと思いますが)。

投稿2019/12/16 09:00

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2019/12/16 09:23

ご回答ありがとうございます。 時刻を考慮せず、日付のみだと前日になってしまうのですね。 勉強になりました。 ありがとうございます。
guest

0

以前ちょっといたずらで作ったことがあります。
このmethodを何年まで使うか、によるのですが、2100年は越えないだろう、ということで、1900/3/1 から 2100/2/28 まで有効版ですが

def age days ((days + 0.8)/365.25).to_i end

0.8は0.75 で良いんですが1では大きすぎ。
1年は365.24某 なんですが、1900〜2100は「100で割り切れる年は」例外がないので365.25でよし

otn さんの言われる
いずれにせよ、誕生日の当日に歳を取る(世間一般)のか、誕生日の前日に歳を取る(民法)のか、決めて調整は必要。
に応じて、0.8を 1.8にするとかの調整はお願いします。

投稿2019/12/16 07:06

編集2019/12/16 07:12
winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/12/16 07:09

自分の誤字に気づきました。「年を歳る」(w)。 「年」を「歳」に修正しようとして間違いましたので、修正しておきます。ありがとうございます。
tkshp

2019/12/16 08:25

ご回答ありがとうございました。
guest

0

ベストアンサー

それぞれの年の差で年数を求めて、それぞれの月日でどちらが大きいかで今年の誕生日が来たかどうかを判断して補正する。

別案追記:
birthday.next_year(n)n+=1しながらtodayと比べ、越えたときにn-1が年齢。

いずれにせよ、誕生日の当日に歳を取る(世間一般)のか、誕生日の前日に歳を取る(民法)のか、決めて調整は必要。誕生日の当日に歳を取る場合は、2/29生まれの人がいつ歳を取るのかも決めて、そこを考慮。

投稿2019/12/16 05:43

編集2019/12/16 07:08
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2019/12/16 05:53

ご回答ありがとうございます。 すみません、理解できなかったので質問です。 それぞれの年の差 → どれとどれの年の差でしょうか? それぞれの年の差で年数を求めて → 上記がわからない為、わからなかったです。
otn

2019/12/16 05:57

誕生日の年(正確には「生年月日の年」)と、今日の年です。
winterboum

2019/12/16 07:12

おお、気が付きませんでした。引用も直しておきました
tkshp

2019/12/16 08:01

ご回答ありがとうございます。 第1案やwinterboumさんのロジックが理解できなかったのですが、 別案の方は理解できたので、そちらで実装しました。 まず、民法の方は知らなかったので、勉強になりました。ありがとうございます。 今回は、誕生日の当日に歳を取る(世間一般)で考えたいと思います。 2/29生まれの人は3/1で年をとる仕様にしたいと思うのですが、 その場合は特に何も調整することなく、 birthday.next_year(n) < today をループの条件に回していく処理で合っていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問