日本の年齢 (Meguro.rb#14)
ymrl
自己紹介
ymrl(やまある)
freee株式会社
人事労務エンジニアをしてます
https://gyazo.com/244722ef0821bf5b8f05de15ffdbe949
人事労務freeeを開発しています
https://gyazo.com/e49ad87dcc9a2d2d145249fec7791470
年齢について
40歳になったら介護保険料を徴収される
64歳になったら雇用保険料を徴収されなくなる
そのほかいろいろ
年齢が誕生日の前日にインクリメントされる問題
4月1日生まれの人は3月31日生まれの人と同じ学年になる
4月2日生まれの人はひとつ下の学年になる
年齢計算に関する法律
明治三十五年法律第五十号(年齢計算ニ関スル法律)
○1 年齢ハ出生ノ日ヨリ之ヲ起算ス
○2 民法第百四十三条ノ規定ハ年齢ノ計算ニ之ヲ準用ス
○3 明治六年第三十六号布告ハ之ヲ廃止ス
民法143条
第百四十三条 週、月又は年によって期間を定めたときは、その期間は、暦に従って計算する。
2 週、月又は年の初めから期間を起算しないときは、その期間は、最後の週、月又は年においてその起算日に応当する日の前日に満了する。ただし、月又は年によって期間を定めた場合において、最後の月に応当する日がないときは、その月の末日に満了する。
解釈すると
以上の条文から年齢が加算されるのは起算日に応答する日の前日の満了時となる。つまり、年を取る時刻は誕生日前日が満了する「午後12時」(24時0分0秒)と解されている(「前日午後12時」と「当日午前0時」は時刻としては同じだが、属する日は異なることに注意)。
つまり
年齢がインクリメントされるのは誕生日前日の24時0分
これは誕生日当日の0時0分と同じ瞬間だが属する日が違う
年齢がインクリメントされる瞬間が誕生日前日なので歳を取るのは誕生日前日
日を単位にする場合は歳を取った日を使う
年齢規定を持つ法令は多いが、その年齢は本法に基づいて計算している。各条文の表現により効力の開始が「誕生日前日からのもの」と「誕生日当日からのもの」があるが、その違いは単位である。日を単位とする場合、時刻の部分(午後12時)を切り捨てるため、その効力は誕生日前日の初め(午前0時)から発生している。一方、時刻を単位とする場合、その効力は誕生日前日の午後12時まで(すなわち誕生日を迎えるまで)発生しない。
これを実装してみた
日を単位に計算する
code:ruby
jp_age = JpAge.new(Date.new(1988, 4, 1))
jp_age.age_as_of(Date.new(2018, 4, 1)) # => 30
jp_age.age_as_of(Date.new(2018, 3, 31)) # => 30
jp_age.age_as_of(Date.new(2018, 3, 30)) # => 29
時刻を単位に計算する
code:ruby
jp_age = JpAge.new(Date.new(1988, 4, 1))
jp_age.age_as_of(Time.new(2018, 3, 31, 23, 59, 59, '+09:00')) #=> 29 jp_age.age_as_of(Time.new(2018, 3, 31, 24, 0, 0, '+09:00')) #=> 30 Time
code:ruby
irb(main):001:0> Time.new(2018, 3, 31, 24, 0, 0, '+09:00')
=> 2018-04-01 00:00:00 +0900
中身
code:ruby
def age_as_of(moment)
date = case moment
when DateTime, Time
m = (moment.is_a?(Time) ? moment : moment.to_time)
m.localtime('+09:00').to_date - 1
when Date
moment
else
raise ArgumentError 'Not Date, Time, or DateTime'
end
# (20180427 - 19880611) / 10000 みたいなことをする
((date + 1).strftime('%Y%m%d').to_i - @birth_date.strftime('%Y%m%d').to_i) / 10_000
end
rubyってすげーな
似たgemあった
そういや日本に限ったものを作るとき hogehoge_jp みたいにする文化あった
https://gyazo.com/4b99e69d09dbcb984bc6e5a4f27309c0
なんかいろいろできそう
code:ruby
Timecop.freeze(Time.new(2014, 12, 31))
birthday = Date.new(2000, 1, 1)
birthday.age # 14 (通常の年齢)
birthday.age_at(Date.today) # same as birthday.age
birthday.age_jp # 15 (日本の法律準拠)
birthday.age_jp_at(Date.today) # same as birthday.age_jp
birthday.east_asian_age_reckoning # 15 (数え年)
birthday.east_asian_age_reckoning_at(Date.today) # same as birthday.east_asian_age_reckoning
birthday.insurance_age # 14 (保険年齢)
birthday.insurance_age_at(Date.today) # same as birthday.insurance_age
birthday.to_years_old(17) # 2017/01/01. 17歳の誕生日を返却
birthday.to_years_old_jp(17) # 2016/12/31. 17歳の年齢加算日(日本の法律準拠)を返却
時間までは見てなさそう(そりゃそうか)