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

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

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

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

Q&A

解決済

4回答

1397閲覧

(リファクタ相談)うるう年生まれの人も、毎年誕生日を祝ってあげたい

alyoalyoalyo

総合スコア12

Ruby

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

0グッド

0クリップ

投稿2018/09/06 02:28

##前提:
・ユーザの誕生日がDateクラスの yyyy/mMM/DD で入ってる(例 1992/02/29)

  • 今回誕生日を祝ってあげる対象のユーザは

閏年生まれの2/29生まれの人と
それ以外(誕生日が毎年くる人)

##やりたいこと:
◇閏年生まれの人の誕生日判定

  • うるう年には2/29

うるう年以外の年には2/28に誕生日ということにしたい

◇それ以外の人の誕生日判定

  • 今日の日付(dd/mm) == 誕生日のdd/mm

##書いてみたコード

ruby

1require "date" 2 3user = Date.parse("1992/02/29") 4this_year = Date.new(Time.now.year) 5time = Time.now 6 7if ((this_year.leap? == false)\ 8 && (time.strftime("%m/%d") == "02/28")\ 9 && (user.strftime("%m/%d") == "02/29"))\ 10 || (time.strftime("%m/%d") == user.strftime("%m/%d")) 11 puts "誕生日" 12else 13 puts "それ以外" 14end

##ご相談

上記のコードを書いてみたのですが、条件分岐が冗長で、なんだかしっくりきません。
もっとこうかけるよ!というご意見ありましたら、ぜひお聞きしたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

日本の法律上、年齢は「その人の誕生日の前日が終了したとき」に加算されることになっています。
なので 2/29 生まれの人は、平年では 3/1 を誕生日として扱う方が適切です。

投稿2018/09/06 03:09

tacsheaven

総合スコア13703

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

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

alyoalyoalyo

2018/09/06 03:18

おお‥ありがとうございます。 今回初質問なのですが相談してよかったです!
yambejp

2018/09/06 03:19

「年齢を加算する」処理ではなく 「誕生日を祝いたい」という処理なのですから どうせ近似で祝われるなら後より前のほうがいいと思いますけどね (あとで祝われると「忘れてたでしょ?」ってなりそうなので)
tacsheaven

2018/09/06 04:23

近似という話ではないんですけどね……後で祝われると、といっても、前に祝ったとしたって何かしら文句は言われかねないのですし。
guest

0

birth.rb

ruby

1require "date" 2 3def birthday_party?(user_birthday, the_day) 4 date_format = "%m%d" 5 user_mmdd = (user_birthday.strftime(date_format).to_i) 6 day_mmdd = (the_day.strftime(date_format).to_i) 7 8 if user_mmdd == 229 && !the_day.leap? 9 return true if day_mmdd == 228 10 end 11 user_mmdd == day_mmdd 12 13end 14 15TESTS = [ 16 ['1992/02/28', '2004/02/28', true], 17 ['1992/02/28', '2004/02/29', false], 18 ['1992/02/28', '2004/03/01', false], 19 20 ['1992/02/28', '2005/02/28', true], 21 ['1992/02/28', '2005/03/01', false], 22 23 ['1992/02/29', '2004/02/28', false], 24 ['1992/02/29', '2004/02/29', true], 25 ['1992/02/29', '2004/03/01', false], 26 27 ['1992/02/29', '2005/02/28', true], 28 ['1992/02/29', '2005/03/01', false] 29].freeze 30 31TESTS.each do |test| 32 user_birthday = Date.parse(test[0]) 33 the_day = Date.parse(test[1]) 34 puts "-- Fail! #{test}" if test[2] != birthday_party?(user_birthday, the_day) 35end

参考情報

  • 2月29日に生まれた人の誕生日はどうなるか - なぜなに大事典

https://5w1h-allguide.com/2%E6%9C%8829%E6%97%A5-486

  • うるう年2月29日生まれの誕生日! 戸籍などの法律はどうなるの?

https://zakizaki-loglog.com/1665.html

...
『みなし誕生日』といって、
うるう年でない年の誕生日は、
2月28日にすることが
法律で決められているんです。
...

投稿2018/09/08 09:20

katoy

総合スコア22324

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

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

0

プログラム字面上で、条件判断を省く事が出来るかが検討ポイントでしょうか。

Ruby

1require "date" 2 3users = %w|1992/02/28 1992/02/29 1992/03/01| 4todays = %w|2018/02/28 2018/03/01| 5 6todays.each do |today| 7 today = Date.parse(today) 8 users.each do |user| 9 user = Date.parse(user) 10 11 tanjobi = user.next_year(today.year-user.year) 12 if today.strftime("%m/%d") == tanjobi.strftime("%m/%d") 13 p [today.strftime("%F"), user.strftime("%F"), "誕生日"] 14 else 15 p [today.strftime("%F"), user.strftime("%F"), "それ以外"] 16 end 17 end 18end

誕生日を3/1にするのだと、こう間単には行かない。
誕生日祝いするという観点だと、幼稚園や老人ホームなどである「x月生まれの人の誕生会」を考えると、2/28がいいですね。

投稿2018/09/06 06:54

otn

総合スコア84423

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

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

0

ベストアンサー

2/29生まれの人は3/1の1日前に祝ってあげればよいでしょう

投稿2018/09/06 02:55

yambejp

総合スコア114572

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

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

alyoalyoalyo

2018/09/06 03:18

その発想は出てこなかったです‥! すごい、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問