PHPは年齢を計算します


160

DOBがdd / mm / yyyyの形式で指定されている人の年齢を計算する方法を探しています。

私は次の関数を使用していましたが、なんらかのグリッチによってwhileループが終了せず、サイト全体が停止するまで、数か月間は問題なく機能しました。1日数回この機能を通過するDOBはほぼ100,000あるため、これを引き起こしている原因を突き止めるのは困難です。

誰かが年齢を計算するより信頼できる方法を持っていますか?

//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 2011

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

この機能は、他のソリューションよりも実際にコストがかかります。これは、date()関数の使いすぎによるものです。
Jarzon 2013年

いい日割り日。ありがとう
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を使用しています:(
GusDeCooL

3
本当にタイムゾーンが必要ですか?
アンドレ・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を計算する簡単な方法:

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

31556926 1年の秒数です。


16
関数の過度の使用...$_age = floor((time() - strtotime('1986-09-16')) / 31556926);
Mavelo 2013

4
最適なソリューション... 1つのライナー、シンプルで使用を避けます:mktime
Timmy

1
@RobertM。この場合それはそれほど悪いですか?これらの機能がそれほど複雑で「重い」とは思わない
Dewan159

1
@ Dewan159編集履歴を確認...私のソリューションに合わせて変更されました;)
Mavelo

4
うるう秒はどうですか?
ksimka 2016年

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

ドブを使用する年齢を計算したい場合は、この関数も使用できます。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つのfuncsは、第二の機能上だけのわずかな違いでもプリフォーム。私の結果に基づいた私の提案は、人の誕生日に特定のことをしたくない場合を除いて、3番目の関数を使用することです。

テストに関する小さな問題と2番目の方法に関する別の問題が見つかりました!ブログは近日更新予定!とりあえず、2番目の方法はオンラインで見つけた最も人気のある方法ですが、それでも最も不正確な方法を見つけています。

私の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

CarbonLibraryを使用できます。これは、DateTimeのAPI拡張です。

あなたはできる:

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

または:

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

1
これはよりクリーンなソリューションですが、すべてのプロジェクトに最適であるとは限らない外部libが必要です
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に置き換えます。

もう1つの重要なことは、UNIXを使用しているためタイムスタンプを 1901年と2038年の両方の問題があり、上記の式が1901年より前と2038年より後の日付に対して正しく機能しないことです。

上記の制限に耐えることができれば、そのコードはうまくいくはずです。


2038年に何が起こるか「すべてのシステム」は、time()を使用するとクラッシュしますか?
ミゲル

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 09/10/23

あなたは何歳の精度が必要ですか?月?日?
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 );
}

これの使い方

$ age = 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 2015

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か月(1か月を数える)


これは、5.3より前のバージョンのPHPを使用していて、date_diffなどにアクセスできない人には、実際に良い解決策です。
strangerstudios 14

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

これに対する最高の答えは問題ありませんが、人が生まれた年を計算するだけで、私は自分の目的のために日と月を計算するために微調整しました。しかし、それは共有する価値があると思いました。

これは、ユーザーの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部分をキャンセルし、それを下にフロアします。シンプルで失敗することはなく、うるう年と現在のサーバー時間を考慮に入れることもできます;)

birthaysまたはほとんどの場合出生場所の完全な日付によって提供され、現在の現地時間(年齢チェックが実際に行われる場所)に関連しているため。

$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.