熱で寝込んでいるうちにいつの魔にあけてましたねおめでとうございます。

というわけで新年っぽいネタを。

これ、日本ではなんと法律違反です。


これのどこが法律違反かがわかると、なぜ4月1日生まれが早生まれになるのかがわかります。

初日不算入の原則外

今年2012年2月29日の一年後はいつでしょうか?

通常の法律では、来年2013年3月1日ということになります。

年齢計算ニ関スル法律 - Wikipedia
日、週、月又は年によって期間を定める場合、その初日が午前0時を過ぎて始まるときは、その翌日を起算日として期間計算をするのが原則(初日不算入の原則)である(民法138条、140条)

ところが、2012年2月29日生まれの子の満一才の誕生日は、あくまで2013年2月28日--の24:00--であって、3月1日ではないのです。

年齢計算ニ関スル法律 - Wikipedia
これに対し、本法では、年齢計算の場合には初日不算入の原則を採用しない旨を定めており、本法は、期間計算に関する特別法に当たる。また、民法143条の準用によって、年齢計算に関して、日数ではなく週、月又は年により期間(年齢)を数える「暦法的計算方法」を採用することにより、満了日(加齢日)は起算日(初日=出生日)に応当する日(誕生日)の前日であることになる。

「うるう年でない2月28日の24:00は3月1日だろJK」という、0を自然数に含める良識ある人々(含む私:-)には残念なことに、こと誕生日に限って言えば、この国ではあくまでそれは人生第一日であって零日ではないということだそうです。

JavaScriptによる実装

manNenrei = function(bd, td){
    if (!td)            td = new Date();
    if (td - bd < 0)    throw new Error('not born yet');
    var dbbd = new Date(bd - 86400e3),  /* the day before the birthday */
        dm   = td.getMonth() - dbbd.getMonth(); /* delta month */
    return td.getYear() - dbbd.getYear()
        - (     dm < 0                            ? 1 /* before */
            :   dm > 0                            ? 0 /* after  */
            :   td.getDate() - dbbd.getDate() < 0 ? 1 /* before */
                                                  : 0 /* after  */
        );
};

ただでさえ日付まわりはバグがわきやすいのにorz…

Test

try{
    p( manNenrei(new Date(1992,1-1,1), new Date(1990,1-1,1)) );
}catch(e){
    p( e );
}
p(manNenrei(new Date(1992,1-1,1),             new Date(1992,1-1,1)));  /*  0 */
p(manNenrei(new Date(1992,1-1,1),             new Date(1992,12-1,31)));/*  1 */
p(manNenrei(new Date(1992,1-1,1)),            new Date(2012,3-1,31));  /* 20 */
p(manNenrei(new Date(1992,3-1,31),            new Date(2012,3-1,31))); /* 20 */
p(manNenrei(new Date(1992,4-1,1),             new Date(2012,3-1,31))); /* 20 */
p(manNenrei(new Date(1992,4-1,1,23,59,59,999),new Date(2012,3-1,31))); /* 20 */
p(manNenrei(new Date(1992,4-1,2),             new Date(2012,3-1,31))); /* 19 */
p(manNenrei(new Date(1992,12-1,31),           new Date(2012,3-1,31))); /* 19 */ 

初日不算入の原則が年齢にも適用されれば、dbbd相当のところはbdのままでよかったのに。π=4な法律に対して感じるのと同様の憤りを禁じ得ません。が、少なくともこれで(祝日ではなく法的な意味での)成人の日は一日早く訪れることになります。

というわけで、今年3月1日に満18才以上の希望者に薄い本を頒布なさりたい善良な日本国住民におかれましては、1994年2月28日生まれの方を不当はさておき不法に排除なさらないようお願いするものであります。

Dan the Taxpayer Who Needs to Pay More Attention than He Should