【问题标题】:PHP age calculater wrong agePHP年龄计算器错误年龄
【发布时间】:2012-03-26 11:47:14
【问题描述】:

我有一个 PHP 的年龄计算脚本。但是,它似乎适用于某些日期,我不明白为什么它不起作用。

function Agecalc($birthday) 
{

    list($day,$month,$year) = explode("/",$birthday);
    $day_diff   = date("d") - $day;
    $month_diff = date("m") - $month;
    $year_diff  = date("Y") - $year;
    if ($day_diff < 0 || $month_diff < 0)
        $year_diff--;
    return $year_diff;

}

echo Agecalc('19/2/1994');

这应该是 18 时返回“17”?

【问题讨论】:

标签: php


【解决方案1】:

除了您应该使用内置函数来进行日期差异之外,让我们通过分解它来解决为什么您呈现的代码无法按预期工作的问题。

function Agecalc($birthday) 
{
    list($day,$month,$year) = explode("/",$birthday);
    $day_diff   = date("d") - $day; // 9 - 19 = -10
    $month_diff = date("m") - $month; // 3 - 2 = 1
    $year_diff  = date("Y") - $year; // 2012 - 1994 = 18

现在您在原始代码中所做的是,如果日期差异月份差异为负数,则年龄相差一整年。这从根本上来说是有缺陷的,因为当日差为负时,计算可能只有一个月,而不是一年。

因此,您可以通过减少月差来应对负数。

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

现在日差异和我们的月差异 = 0。如果它是负数,我们仍然需要考虑它,所以把这个块放在最后。

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

    return $year_diff;
}

您示例的最终结果现在返回 18,因为即使考虑了负数天数,月份仍然是正数。

【讨论】:

    【解决方案2】:

    您的函数在每次输入日期部分(在 input_date 中)优于当前日期部分(在 current_date 中)时,都会返回错误的年龄

    请在下面提供一个可以提供帮助的功能。如有任何问题,请告诉我。

    /* By default, 
    * format is 'us' 
    * and delimiter is '-'
    */
    
    function date_calculate($input_date, $format = 'us', $delimiter = '-')
    {
        switch (strtolower($format)) {
            case 'us': // date in 'us' format (yyyy/mm/dd), like '1994/03/01'
                list($y, $m, $d) = explode($delimiter, $input_date);
                break;
            case 'fr': // date in 'fr' format (dd/mm/yyyy), like '01/03/1994'
                list($d, $m, $y) = explode($delimiter, $input_date);
                break;
            default: return null;
        }
    
        $tz          = new \DateTimeZone('UTC'); // TimeZone. Not required but can be useful. By default, server TimeZone will be returned
        $format_date = sprintf('%s-%s-%s', $y, $m, $d);
        $cur_date    = new \DateTime(null, $tz);
        $user_date   = new \DateTime($format_date, $tz);
        $interval    = $user_date->diff($cur_date);
    
        return [
            'day'   => $interval->format('%r%d'),
            'month' => $interval->format('%r%m'),
            'year'  => $interval->format('%r%y'),
        ];
    }
    
    var_dump(date_calculate('19/02/1994', 'fr', '/'));
    

    更多++:

    【讨论】:

      【解决方案3】:

      您不应该测试day_diff&lt;0,除非您确定这是同一个月。目前,如果是 12 月 5 日,而我的生日是 4 月 13 日,则减去一年,因为 13 大于 5。

      【讨论】:

        【解决方案4】:

        使用 PHP 的内置 DateTime 函数来计算这一点会很有好处,特别是 DateTime::diff(..)

        function AgeCalc($birthday)
        {
            $dateBirthday = DateTime::createFromFormat('d/m/Y', $birthday);
            $dateNow = new DateTime();
            $difference = $dateNow->diff($dateBirthday);
            return $difference->y;
        }
        

        【讨论】:

          【解决方案5】:

          更新

          我写了一篇博文,介绍了 PHP 中最流行的 3 种函数。

          查看结果

          HERE

          在一行中:仅供参考,有一种更短的方法可以与我们人类计算生日的方法相媲美:

          return intval(substr(date('Ymd') - date('Ymd', strtotime($birthday)), 0, -4))
          

          【讨论】:

            【解决方案6】:

            这是从生日计算年龄的更简短的简单 php

            function getAge($birthdate){
              return floor((time() - strtotime($birthdate))/31556926);
            }
            

            【讨论】:

              猜你喜欢
              • 2020-12-28
              • 2011-04-16
              • 1970-01-01
              • 1970-01-01
              • 2016-03-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多