「何年何ヶ月と何日がカレンダー通りに経ったか」という計算を考えてみます。前日の夜中の12時とのこと。2月29日生まれの人は翌年2月28日24時、つまり3月1日0時に年齢が一つ上がることになる。誕生日は3月1日になるのですね。西暦年が4で割り切れる年は閏年ただし、西暦年が100で割り切れる年は平年ただし、西暦年が400で割り切れる年は閏年という規則とのこと生年月日から満年齢を計算する際、単純に引いて365で割ると閏年分が狂います。#365で割ると1以上になり満1才と誤ってしまうとなってしまい、2000年3月1日の前日に1才になってしまいます。普通に考えると閏年を規定する関数が必要ですが、賢い人はいるもので下記のように一旦数値化することにより閏年に無関係に正確に満年齢計算が可能になります。19990301と20000229という数値にして引き算をするというものです。10000で割ると満年齢が整数値として取得できます。小児科領域の場合、1才未満の月齢計算も必要になります。これも満月齢という考え方で良いようです。8月31日生まれの人は10月1日に1ヶ月齢になります。これも単純に30で割ったりすると実際には1ヶ月は28日〜31日までバラツキがあるのでおかしいことになります。#満1ヶ月だが30で割ると1未満にしかしこれもstrftime.to_iを使った数値化をよく見ると、万の桁のくり下がりは必ず12、つまり1年=12ヶ月なので月齢は下記のように計算できます。同じ原理で満年齢、満月齢が分かったところで端数の日数が分かるか、つまり「何年何ヶ月と何日がカレンダー通りに経ったか」という問に答えようとします。末日の日付が起算日の日付と一緒かより大きい場合は単純に日付を引くだけです。起算日の日付の方が大きい時が問題になります。起算日より満年月を足した年月日を末日より引く操作が必要になります。"2001-02-28"と大丈夫そう。#端数の日数は21日メソッド(関数)を書いてみました。'今日で'+datedif(bd,today,'y').to_s+'歳'+datedif(bd,today,'ym').to_s+'ヶ月'+datedif(bd,today,'md').to_s+'日です。'今日で42歳5ヶ月26日です。nilとりあえず動いている様子。いった表示の計算がExcelではDatedifという簡単な式として定義されています。思いきや結構バグだらけな様子。