【java】日数計算-生後何年何ヶ月何日?詳しい年齢を取得【android】

javaで日付の計算をしようとした時にすごくハマってしまいました。もちろん賢い先人たちが、簡潔なコードを教えてくれているのですが、何故かうまく数が合わずにずれてしまいました。一応、参考としてコードを載せておきます。
計算が合わなくてとてもハマったコード

public static void main(Calendar birthday) {
    Calendar cal = Calendar.getInstance();
    long n = cal.getTimeInMillis() - birthday.getTimeInMillis();
    Calendar diffDay = Calendar.getInstance();
    diffDay.setTimeInMillis(n);
    int y = cal3.get(Calendar.YEAR) - 1970;
    int m = cal3.get(Calendar.MONTH) + 1;
    int d = cal3.get(Calendar.DATE);
    System.out.println(y + "歳" + m + "ヶ月" + d + "日");
}

上記は、うまく数が合わなかったコードです。やりたいことはわかるんですけど、この経過日数とかって、その間のうるう年とかうまく計算できていないんじゃないかなと思いました…賢い人、教えて…
 
そこで、自分なりに計算して作りました。

完成コード

詳細な年齢取得

private void calculateAge(Calendar birthday) {
        Calendar todayCal = Calendar.getInstance();
        int tY = todayCal.get(Calendar.YEAR);
        int tM = todayCal.get(Calendar.MONTH);
        int tD = todayCal.get(Calendar.DATE);

        int bY = birthday.get(Calendar.YEAR);
        int bM = birthday.get(Calendar.MONTH);
        int bD = birthday.get(Calendar.DATE);

        int diffY = 0;
        int diffM = 0;
        int diffD = 0;

        // 年を設定
        if (tY > bY) {
            diffY =  tY - bY;
            if (tM < bM || (tM == bM && tD < bD)) {
                diffY--;
            }
        }

        // 月を設定
        diffM = tM - bM;
        if (tD < bD) {
            diffM--;
        }
        if (diffM < 0) {
            diffM+=12;
        }

        // 日を設定
        if (tD >= bD) {
            diffD = tD - bD;
        } else {
            Calendar tmpCal = Calendar.getInstance();
            if (tM == 0) {
                tmpCal.set(tY-1, 11,bD);
            } else {
                tmpCal.set(tY, tM-1,bD);
            }
            long diff = todayCal.getTimeInMillis() - tmpCal.getTimeInMillis();
            Calendar diffCal = Calendar.getInstance();
            diffCal.setTimeInMillis(diff);
            diffD = diffCal.get(Calendar.DATE) - 1;
        }

    System.out.println(diffY + "歳" + diffM + "ヶ月" + diffD + "日");
    }

このメソッドはコピペでそのまま使えるかと思います。引数には生まれた日付をCalendar型で入れています。

これでなんとか、詳細な年齢が誤差なく取得できるようになりました!うるう年だって問題なしなはずです!!