-1

我正在使用以下函数从给定的出生日期计算年龄,但如果使用闰年,即 29,它不会显示正确的差异。请帮我修复此代码。

<?php
function getAbsAge($birthday)
    {
        list($year,$month,$day) = explode("-", $birthday);
        $year_diff  = date("Y") - $year;
        $month_diff = date("m") - $month;
        $day_diff   = date("d") - $day;

        if ($day_diff < 0 || $month_diff < 0)
        {
            $year_diff--;
        }

        if ($year_diff == 0)
        {
            $interval = date_diff(date_create(), date_create($birthday));
            $months = $interval->format("%M");
            $days = $interval->format("%d");

            if ($months > 0)
            {
                return $interval->format("%M Months %d Days");
            }
            else if ($months == 0 && $days > 1)
            {
                return $interval->format("%d Days");
            }
            else
            {
                return $interval->format("%d Day");
            }
        }
        else if ($year_diff == 1)
        {
        return "$year_diff Year";
    }
        else if ($year_diff > 1)
        {
        return "$year_diff Years";
    }
    }
echo getAbsAge("2012-02-29")
?>

另外,如果有人可以提出更好的代码,请更新它。

如果一个人不到 1 岁,我需要以月和日为单位查找出生日期。

我的服务器上有最新的 5.4 php 版本。

随着 2012-02-29,它返回 2 年,而它应该是 3 年。请帮忙。

4

1 回答 1

1

为什么您不date_diff()一直使用该功能?它会给你想要的结果:

function getAbsAge($birthday) {

    $age = '';
    $diff = date_diff(date_create(), date_create($birthday));
    $years = $diff->format("%y");
    $months = $diff->format("%m");
    $days = $diff->format("%d");

    if ($years) {
        $age = ($years < 2) ? '1 Year' : "$years Years";
    } else {
        $age = '';
        if ($months) $age .= ($months < 2) ? '1 Month ' : "$months Months ";
        if ($days) $age .= ($days < 2) ? '1 Day' : "$months Days";
    }
    return trim($age);
}

另一种方法是以秒为单位计算时间差并从那里获取:

list($year,$month,$day) = explode("-", $birthday);
$diff = mktime(0,0,0,date('n'),date('j'),date('Y')) - mktime(0,0,0,$month,$day,$year);

那么一天由 24 小时组成,每个小时有 60 分钟,每个小时有 60 秒:

$sday = 60 * 60 * 24;

然后计算年差将是:

$years = floor($diff / (365.2425 * $sday));     

但我会坚持使用我向您展示的第一个版本date_diff()

于 2015-03-28T14:48:24.083 回答