PHP는 나이를 계산


160

DOB를 dd / mm / yyyy 형식으로 지정하여 사람의 나이를 계산하는 방법을 찾고 있습니다.

나는 어떤 종류의 결함으로 인해 while 루프가 끝나지 않고 전체 사이트가 정지 될 때까지 몇 달 동안 잘 작동하는 다음 기능을 사용하고있었습니다. 하루에 여러 번이 기능을 수행하는 거의 10 만 개의 DOB가 있기 때문에이 원인을 파악하기가 어렵습니다.

누구나 나이를 계산하는 데 더 신뢰할만한 방법이 있습니까?

//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));       
$tdate = time();

$age = 0;
while( $tdate > $dob = strtotime('+1 year', $dob))
{
    ++$age;
}
return $age;

편집 :이 기능은 때때로 제대로 작동하는 것처럼 보이지만 1986 년 9 월 14 일 DOB에 대해 "40"을 반환합니다.

return floor((time() - strtotime($birthdayDate))/31556926);

답변:


192

이것은 잘 작동합니다.

<?php
  //date in mm/dd/yyyy format; or it can be in other formats as well
  $birthDate = "12/17/1983";
  //explode the date to get month, day and year
  $birthDate = explode("/", $birthDate);
  //get age from date or birthdate
  $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md")
    ? ((date("Y") - $birthDate[2]) - 1)
    : (date("Y") - $birthDate[2]));
  echo "Age is:" . $age;
?>

1
언젠가는 그 형식에 대해 우리가 사용해야 mktime()합니다. PHP strtotime()가 그 형식으로 잘못 계산 한 것 같습니다 .
GusDeCooL

30
PHP는 strtotime날짜 형식을 완벽하게 이해하므로 걱정할 필요가 없습니다. Dates in the m/d/y or d-m-y formats are disambiguated by looking at the separator between the various components: if the separator is a slash (/), then the American m/d/y is assumed; whereas if the separator is a dash (-) or a dot (.), then the European d-m-y format is assumed. php.net/manual/en/function.strtotime.php
s3v3n

이 기능은 다른 솔루션보다 훨씬 비쌉니다. date () 함수를 과도하게 사용하여 발생합니다.
Jarzon 2016 년

일할 계산 된 날짜입니다. 감사합니다
Roque Mejos

172
$tz  = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz)
     ->diff(new DateTime('now', $tz))
     ->y;

PHP 5.3.0부터는 편리한 DateTime::createFromFormat날짜를 사용하여 날짜 m/d/Y와 형식에 대한 오해가 발생하지 않도록 하고 DateInterval클래스를 통해 ( DateTime::diff현재 날짜와 대상 날짜 사이의 연도 수) 얻을 수 있습니다.


1
유망 해 보이지만 불행히도 우리 나라의 대부분의 서버 호스팅은 여전히 ​​PHP
5.2.x를

3
실제로 시간대가 필요합니까?
André Chalella

127
 $date = new DateTime($bithdayDate);
 $now = new DateTime();
 $interval = $now->diff($date);
 return $interval->y;

전에 DateTime ()을 사용해 보았지만 스크립트가 중지되었습니다. 내 로그에는 PHP 경고가 표시됩니다. date () : date_default_timezone_set ( 'Europe / Brussels');
stef

1
해당 줄 전에 #을 제거 했습니까? PHP.ini
Wernight

일반적으로 해당 경고를 무시하는 것이 안전합니다 (특히이 경우).
Wernight


60

dob에서 나이를 계산하는 간단한 방법 :

$_age = floor((time() - strtotime('1986-09-16')) / 31556926);

31556926 1 년의 초 수입니다.


16
과도한 기능 사용 ...$_age = floor((time() - strtotime('1986-09-16')) / 31556926);
Mavelo

4
최고의 솔루션 ... 1 라이너, 단순하고 사용하지 마십시오 : mktime
Timmy

1
@RobertM. 이 경우에 그렇게 나쁘습니까? 나는이 기능들이 그렇게 복잡하거나 무겁다 고 생각하지 않습니다
Dewan159

1
@ Dewan159 편집 기록을 살펴보십시오 ... 내 솔루션과 일치하도록 변경되었습니다.)
Mavelo

4
윤초는 어떻습니까?
ksimka

17

// 나이 계산기

function getAge($dob,$condate){ 
    $birthdate = new DateTime(date("Y-m-d",  strtotime(implode('-', array_reverse(explode('/', $dob))))));
    $today= new DateTime(date("Y-m-d",  strtotime(implode('-', array_reverse(explode('/', $condate))))));           
    $age = $birthdate->diff($today)->y;

    return $age;
}

$dob='06/06/1996'; //date of Birth
$condate='07/02/16'; //Certain fix Date of Age 
echo getAge($dob,$condate);

5
최고의 현대 솔루션 2016.
AlexioVay

14

나는 이것이 효과가 있고 간단하다는 것을 알았다.

strtotime이 1970-01-01부터 시간을 계산하므로 1970에서 빼기 ( http://php.net/manual/en/function.strtotime.php )

function getAge($date) {
    return intval(date('Y', time() - strtotime($date))) - 1970;
}

결과 :

Current Time: 2015-10-22 10:04:23

getAge('2005-10-22') // => 10
getAge('1997-10-22 10:06:52') // one 1s before  => 17
getAge('1997-10-22 10:06:50') // one 1s after => 18
getAge('1985-02-04') // => 30
getAge('1920-02-29') // => 95

거의 사실 ... strtotime ()은 1969-12-31 18:00:00에서 시간을 계산합니다
피닉스

8

dob 사용 연령을 계산하려면이 기능을 사용할 수도 있습니다. DateTime 개체를 사용합니다.

function calcutateAge($dob){

        $dob = date("Y-m-d",strtotime($dob));

        $dobObject = new DateTime($dob);
        $nowObject = new DateTime();

        $diff = $dobObject->diff($nowObject);

        return $diff->y;

}

8

이것이이 질문의 가장 인기있는 형태 인 것 같아서 여기에 던질 것이라고 생각했습니다.

PHP에서 찾을 수있는 가장 인기있는 연령 유형의 3 가지에 대해 100 년 비교를하고 내 결과 (함수뿐만 아니라)를 내 블로그에 게시했습니다. .

보시다시피 , 두 번째 기능에 약간의 차이 만 있으면 3 가지 기능이 모두 프리폼됩니다. 내 결과에 근거한 나의 제안은 당신이 사람의 생일에 특정한 것을하고 싶지 않다면 3 번째 기능을 사용하는 것입니다.이 경우 첫 번째 기능은 정확하게 그렇게하는 간단한 방법을 제공합니다.

테스트에서 작은 문제가 발견되었고 두 번째 방법에서 또 다른 문제가 발견되었습니다! 곧 블로그에 업데이트! 지금은 두 번째 방법이 여전히 온라인에서 가장 인기있는 방법이지만 여전히 가장 부정확 한 방법입니다.

내 100 년 검토 후의 제안 :

생일과 같은 행사를 포함 할 수 있도록 더 길어진 것을 원한다면 :

function getAge($date) { // Y-m-d format
    $now = explode("-", date('Y-m-d'));
    $dob = explode("-", $date);
    $dif = $now[0] - $dob[0];
    if ($dob[1] > $now[1]) { // birthday month has not hit this year
        $dif -= 1;
    }
    elseif ($dob[1] == $now[1]) { // birthday month is this month, check day
        if ($dob[2] > $now[2]) {
            $dif -= 1;
        }
        elseif ($dob[2] == $now[2]) { // Happy Birthday!
            $dif = $dif." Happy Birthday!";
        };
    };
    return $dif;
}

getAge('1980-02-29');

그러나 단순히 나이와 그 이상을 알고 싶다면 다음과 같이하십시오.

function getAge($date) { // Y-m-d format
    return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
}

getAge('1980-02-29');

블로그 참조


strtotime방법 에 대한 주요 참고 사항 :

Note:

Dates in the m/d/y or d-m-y formats are disambiguated by looking at the 
separator between the various components: if the separator is a slash (/), 
then the American m/d/y is assumed; whereas if the separator is a dash (-) 
or a dot (.), then the European d-m-y format is assumed. If, however, the 
year is given in a two digit format and the separator is a dash (-, the date 
string is parsed as y-m-d.

To avoid potential ambiguity, it's best to use ISO 8601 (YYYY-MM-DD) dates or 
DateTime::createFromFormat() when possible.

8

DateTime의 API 확장 인 Carbon라이브러리 를 사용할 수 있습니다 .

당신은 할 수 있습니다 :

function calculate_age($date) {
    $date = new \Carbon\Carbon($date);
    return (int) $date->diffInYears();
}

또는:

$age = (new \Carbon\Carbon($date))->age;

1
이것은 더 깨끗한 솔루션이지만 모든 프로젝트에 가장 적합하지 않을 수있는 외부 라이브러리가 필요합니다
stef

1
탄소 마법 속성을 제공 age을하고있다, diffInYears. 따라서 다음과 같이 작성할 수 있습니다.(new \Carbon\Carbon($date))->age
k0pernikus

4

몇 년 만에 큰 정밀도가 필요하지 않으면 아래 코드를 사용하는 것이 좋습니다 ...

 print floor((time() - strtotime("1971-11-20")) / (60*60*24*365));

이것을 함수에 넣고 날짜 "1971-11-20"을 변수로 바꾸면됩니다.

위 코드의 정밀도는 윤년으로 인해 높지 않습니다. 즉 약 4 년마다 365 일 대신 366 일입니다. 60 * 60 * 24 * 365 식은 1 년의 초 수를 계산합니다. 31536000으로 교체하십시오.

또 다른 중요한 점은 UNIX를 사용하기 때문에 타임 스탬프를 1901 년과 2038 년 문제를 모두 가지고 위의 표현이 1901 년 이전과 2038 년 이후의 날짜에 대해 올바르게 작동하지 않음을 의미합니다.

위에서 언급 한 제한 사항에 따라 살 수 있다면 해당 코드가 효과적입니다.


time ()을 사용하면 2038 년에 "모든 시스템"이 어떻게됩니까?
Miguel

3
//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));       
$tdate = time();
return date('Y', $tdate) - date('Y', $dob);

1
작동하지 않습니다. 귀하의 기능은 1990 년 9 월 1 일에 태어난 사람이 1990 년 10 월 1 일에 태어난 사람과 같은 나이임을 나타냅니다. 두 사람 모두에 대해 (2010-1990) = 20을 계산합니다.
PaulJWilliams

나이의 정밀도는 어느 정도입니까? 달? 일?
Sergey Eremin

3
  function dob ($birthday){
    list($day,$month,$year) = 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--;
    return $year_diff;
  }

어떤 날짜에는 괜찮아 보이지만 다른 날짜에는 IF가 충족되지 않으면 아무것도 반환하지 않습니까?
stef

3

이 스크립트가 신뢰할 만하다는 것을 알았습니다. 날짜 형식은 YYYY-mm-dd로 사용되지만 다른 형식으로 쉽게 수정할 수 있습니다.

/*
* Get age from dob
* @param        dob      string       The dob to validate in mysql format (yyyy-mm-dd)
* @return            integer      The age in years as of the current date
*/
function getAge($dob) {
    //calculate years of age (input string: YYYY-MM-DD)
    list($year, $month, $day) = explode("-", $dob);

    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;

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

    return $year_diff;
}

2
이것이 어떻게 도움이 될지 자세히 설명해주세요. 함수를 붙여 넣는 것만으로는 정답이 아닙니다.
Starx

3
$birthday_timestamp = strtotime('1988-12-10');  

// Calculates age correctly
// Just need birthday in timestamp
$age = date('md', $birthday_timestamp) > date('md') ? date('Y') - date('Y', $birthday_timestamp) - 1 : date('Y') - date('Y', $birthday_timestamp);

3

i18n :

function getAge($birthdate, $pattern = 'eu')
{
    $patterns = array(
        'eu'    => 'd/m/Y',
        'mysql' => 'Y-m-d',
        'us'    => 'm/d/Y',
    );

    $now      = new DateTime();
    $in       = DateTime::createFromFormat($patterns[$pattern], $birthdate);
    $interval = $now->diff($in);
    return $interval->y;
}

// Usage
echo getAge('05/29/1984', 'us');
// return 28

3

DateTime 객체를 사용하여 이들 중 하나를 시도하십시오

$hours_in_day   = 24;
$minutes_in_hour= 60;
$seconds_in_mins= 60;

$birth_date     = new DateTime("1988-07-31T00:00:00");
$current_date   = new DateTime();

$diff           = $birth_date->diff($current_date);

echo $years     = $diff->y . " years " . $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $months    = ($diff->y * 12) + $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $weeks     = floor($diff->days/7) . " weeks " . $diff->d%7 . " day(s)"; echo "<br/>";
echo $days      = $diff->days . " days"; echo "<br/>";
echo $hours     = $diff->h + ($diff->days * $hours_in_day) . " hours"; echo "<br/>";
echo $mins      = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour) . " minutest"; echo "<br/>";
echo $seconds   = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour * $seconds_in_mins) . " seconds"; echo "<br/>";

참조 http://www.calculator.net/age-calculator.html


3

사람의 현재 나이를 계산하는 PHP 스크립트를 작성하십시오.

생년월일 : 11.4.1987

샘플 솔루션 :

PHP 코드 :

<?php
$bday = new DateTime('11.4.1987'); // Your date of birth
$today = new Datetime(date('m.d.y'));
$diff = $today->diff($bday);
printf(' Your age : %d years, %d month, %d days', $diff->y, $diff->m, $diff->d);
printf("\n");
?>

샘플 출력 :

나이 : 30 세, 3 개월, 0 일


2

이것은 연도 별, 월별, 일별 나이로 DOB를 계산하는 기능입니다.

function ageDOB($y=2014,$m=12,$d=31){ /* $y = year, $m = month, $d = day */
date_default_timezone_set("Asia/Jakarta"); /* can change with others time zone */

$ageY = date("Y")-intval($y);
$ageM = date("n")-intval($m);
$ageD = date("j")-intval($d);

if ($ageD < 0){
    $ageD = $ageD += date("t");
    $ageM--;
    }
if ($ageM < 0){
    $ageM+=12;
    $ageY--;
    }
if ($ageY < 0){ $ageD = $ageM = $ageY = -1; }
return array( 'y'=>$ageY, 'm'=>$ageM, 'd'=>$ageD );
}

이것을 사용하는 방법

$ 연령 = ageDOB (1984,5,8); / * 현지 시간은 2014-07-01 * /입니다.
echo sprintf ( "연령 = % d 년 % d 개월 % d 일", $ age [ 'y'], $ age [ 'm'], $ age [ 'd']); / * 출력-> 연령 = 29 년 1 개월 24 일 * /

2

이 함수는 나이를 년 단위로 반환합니다. 입력 값은 날짜 형식 (YYYY-MM-DD) 생년월일입니다. 예 : 2000-01-01

그것은 하루와 함께 작동합니다-정밀

function getAge($dob) {
    //calculate years of age (input string: YYYY-MM-DD)
    list($year, $month, $day) = explode("-", $dob);

    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;

    // if we are any month before the birthdate: year - 1 
    // OR if we are in the month of birth but on a day 
    // before the actual birth day: year - 1
    if ( ($month_diff < 0 ) || ($month_diff === 0 && $day_diff < 0))
        $year_diff--;   

    return $year_diff;
}

건배


1

새로운 기능 중 일부를 사용할 수없는 경우 여기에 채찍질이 있습니다. 아마도 당신이 필요로하는 것보다 많을 것입니다. 더 나은 방법이 있지만 확실하게 읽을 수 있으므로 작업을 수행해야합니다.

function get_age($date, $units='years')
{
    $modifier = date('n') - date('n', strtotime($date)) ? 1 : (date('j') - date('j', strtotime($date)) ? 1 : 0);
    $seconds = (time()-strtotime($date));
    $years = (date('Y')-date('Y', strtotime($date))-$modifier);
    switch($units)
    {
        case 'seconds':
            return $seconds;
        case 'minutes':
            return round($seconds/60);
        case 'hours':
            return round($seconds/60/60);
        case 'days':
            return round($seconds/60/60/24);
        case 'months':
            return ($years*12+date('n'));
        case 'decades':
            return ($years/10);
        case 'centuries':
            return ($years/100);
        case 'years':
        default:
            return $years;
    }
}

사용 예 :

echo 'I am '.get_age('September 19th, 1984', 'days').' days old';

도움이 되었기를 바랍니다.


1

윤년으로 인해 한 날짜를 다른 날짜에서 빼고 몇 년으로 나누는 것이 현명한 것은 아닙니다. 인간과 같은 나이를 계산하려면 다음과 같은 것이 필요합니다.

$birthday_date = '1977-04-01';
$age = date('Y') - substr($birthday_date, 0, 4);
if (strtotime(date('Y-m-d')) - strtotime(date('Y') . substr($birthday_date, 4, 6)) < 0)
{
    $age--;
}

1

다음은 저에게 효과적이며 이미 제공된 예보다 훨씬 간단한 것 같습니다.

$dob_date = "01";
$dob_month = "01";
$dob_year = "1970";
$year = gmdate("Y");
$month = gmdate("m");
$day = gmdate("d");
$age = $year-$dob_year; // $age calculates the user's age determined by only the year
if($month < $dob_month) { // this checks if the current month is before the user's month of birth
  $age = $age-1;
} else if($month == $dob_month && $day >= $dob_date) { // this checks if the current month is the same as the user's month of birth and then checks if it is the user's birthday or if it is after it
  $age = $age;
} else if($month == $dob_month && $day < $dob_date) { //this checks if the current month is the user's month of birth and checks if it before the user's birthday
  $age = $age-1;
} else {
  $age = $age;
}

이 코드를 테스트하고 적극적으로 사용했는데 약간 번거로울 수 있지만 사용 및 편집이 매우 간단하고 매우 정확합니다.


1

첫 번째 논리에 따라 비교에서 =를 사용해야합니다.

<?php 
    function age($birthdate) {
        $birthdate = strtotime($birthdate);
        $now = time();
        $age = 0;
        while ($now >= ($birthdate = strtotime("+1 YEAR", $birthdate))) {
            $age++;
        }
        return $age;
    }

    // Usage:

    echo age(implode("-",array_reverse(explode("/",'14/09/1986')))); // format yyyy-mm-dd is safe!
    echo age("-10 YEARS") // without = in the comparison, will returns 9.

?>

공감. 작동하는 동안 기본 수학을 수행하기 위해 루프를 사용하는 것은 비효율적입니다.
Wranorn

1

DD / MM / YYYY와 함께 strtotime을 사용할 때 문제가됩니다. 해당 형식을 사용할 수 없습니다. 그 대신 MM / DD / YYYY (또는 YYYYMMDD 또는 YYYY-MM-DD와 같은 다른 많은)를 사용할 수 있으며 제대로 작동합니다.


1

이 쿼리를 시작하고 MySQL에서 계산하는 방법은 다음과 같습니다.

SELECT 
username
,date_of_birth
,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) DIV 12 AS years
,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) MOD 12 AS months
FROM users

결과:

r2d2, 1986-12-23 00:00:00, 27 , 6 

사용자는 27 년 6 개월입니다 (한 달 전체 계산).


이것은 실제로 date_diff 등에 액세스 할 수없는 5.3 이전 버전의 PHP 사용자에게 좋은 솔루션입니다.
strangerstudios

1

나는 이렇게했다.

$geboortedatum = 1980-01-30 00:00:00;
echo leeftijd($geboortedatum) 

function leeftijd($geboortedatum) {
    $leeftijd = date('Y')-date('Y', strtotime($geboortedatum));
    if (date('m')<date('m', strtotime($geboortedatum)))
        $leeftijd = $leeftijd-1;
    elseif (date('m')==date('m', strtotime($geboortedatum)))
       if (date('d')<date('d', strtotime($geboortedatum)))
           $leeftijd = $leeftijd-1;
    return $leeftijd;
}

1

이것에 대한 가장 좋은 대답은 괜찮지 만 사람이 태어난 해만 calcaltes, 나는 그것을 목적으로 일과 달을 해결하기 위해 그것을 조정했습니다. 그러나 공유 할 가치가 있다고 생각했습니다.

이것은 사용자 DOB의 타임 스탬프에 의해 작동하지만 자유롭게 변경할 수 있습니다.

$birthDate = date('d-m-Y',$usersDOBtimestamp);
$currentDate = date('d-m-Y', time());
//explode the date to get month, day and year
$birthDate = explode("-", $birthDate);
$currentDate = explode("-", $currentDate);
$birthDate[0] = ltrim($birthDate[0],'0');
$currentDate[0] = ltrim($currentDate[0],'0');
//that gets a rough age
$age = $currentDate[2] - $birthDate[2];
//check if month has passed
if($birthDate[1] > $currentDate[1]){
      //user birthday has not passed
      $age = $age - 1;
} else if($birthDate[1] == $currentDate[1]){ 
      //check if birthday is in current month
      if($birthDate[0] > $currentDate[0]){
            $age - 1;
      }


}
   echo $age;

1

당신이 나이로 만 일년을 원한다면, 그렇게하는 가장 간단한 방법이 있습니다. 'YYYYMMDD'형식의 날짜를 숫자로 취급하고 빼십시오. 그런 다음 결과를 10000으로 나누고 바닥에 놓아서 MMDD 부품을 취소하십시오. 단순하고 실패하지 않으며 윤년과 현재 서버 시간도 고려합니다.)

생년월일 또는 생년월일 전체 날짜로 제공되며 현재 현지 시간 (연령 확인이 실제로 수행되는 위치)과 관련이 있습니다.

$now = date['Ymd'];
$birthday = '19780917'; #september 17th, 1978
$age = floor(($now-$birtday)/10000);

생일에 의해 누군가가 시간대에서 18 또는 21 또는 100 미만인지 확인하려면 (원래 시간대는 신경 쓰지 마십시오), 이것이 내 방법입니다


0

이 시도 :

<?php
  $birth_date = strtotime("1988-03-22");
  $now = time();
  $age = $now-$birth_date;
  $a = $age/60/60/24/365.25;
  echo floor($a);
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.