PHP yaşı hesapla


160

Bir kişinin yaşını hesaplamanın bir yolunu arıyorum, dd / mm / yyyy formatında DOB verildi.

Ben bir tür aksaklık süre döngü asla sona erdi ve tüm siteyi durdurmak için öğütmek neden olana kadar birkaç ay boyunca iyi çalıştı aşağıdaki işlevi kullanıyordum. Günde birkaç kez bu işlevden geçen yaklaşık 100.000 DOB olduğundan, buna neden olan şeyi tespit etmek zor.

Yaşı hesaplamanın daha güvenilir bir yolu var mı?

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

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

EDIT: Bu işlev bir süre Tamam çalışıyor gibi görünüyor, ancak 14/09/1986 DOB için "40" döndürür

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

Yanıtlar:


193

Bu iyi çalışıyor.

<?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
Katılıyorum, bazen bu biçim için kullanmamız gerekiyor mktime(). php strtotime()bu format ile yanlış hesaplanmış gibi görünüyor .
GusDeCooL

30
PHP'nin strtotimetarih formatlarını mükemmel bir şekilde anlaması, endişelenmenize gerek yok: 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

Bu işlev diğer çözümlerden çok daha maliyetlidir. Date () işlevinin aşırı kullanımından geliyor.
Jarzon

Güzel orantılı tarih. Teşekkürler
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'dan DateTime::createFromFormatitibaren, tarih m/d/Yve biçim ile yanlış anlaşılmadığından emin olmak için kullanışlı olanı ve şimdi ile hedef tarih arasındaki yıl sayısını elde etmek için DateIntervalsınıfı (üzerinden DateTime::diff) kullanabilirsiniz.


1
Umut verici görünüyor, ama ne yazık ki ülkemde barındırma sunucusunun çoğu hala PHP 5.2.x kullanıyor:
GusDeCooL

3
Gerçekten bir saat dilimine ihtiyacı var mı?
André Chalella

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

Daha önce DateTime () kullanarak denedim ama bu komut dosyasını dondurur. Günlüklerimde PHP görüyorum Uyarı: date (): date_default_timezone_set ('Europe / Brussels') eklediğimde bile sistemin saat dilimi ayarlarına güvenmek güvenli değil;
stef

1
Bu satırdan önce # işareti kaldırdığınızdan emin misiniz? PHP.ini
Wernight

Bu uyarıyı göz ardı etmek genellikle güvenlidir (özellikle bu durumda).
Wernight


60

Dob'dan Yaş hesaplamak için basit bir yöntem:

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

31556926 bir yıldaki saniye sayısıdır.


16
fonksiyonların aşırı kullanımı ...$_age = floor((time() - strtotime('1986-09-16')) / 31556926);
Mavelo

4
En iyi çözüm ... 1 astar, basit ve kullanmaktan kaçının: mktime
Timmy

1
@RobertM. Bu durumda bu çok mu kötü? Bu işlevlerin o kadar karmaşık veya "ağır" olduğunu düşünmüyorum
Dewan159

1
@ Dewan159 düzenleme geçmişine bakın ... benim
çözümümle

4
Artık saniye ne olacak?
ksimka

17

// Yaş Hesaplayıcı

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
En iyi modern çözüm 2016.
AlexioVay

14

Bunun işe yaradığını ve basit olduğunu düşünüyorum.

1970'den çıkarma çünkü strtotime 1970-01-01 arasındaki zamanı hesaplar ( http://php.net/manual/en/function.strtotime.php )

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

Sonuçlar:

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

Neredeyse doğru ... strtotime (), 1969-12-31 18:00:00
anka kuşu

8

Dob kullanım yaşını hesaplamak istiyorsanız, bu işlevi de kullanabilirsiniz. DateTime nesnesini kullanır.

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

Bu sorunun en popüler şekli gibi göründüğü için bunu buraya atacağımı düşündüm.

Ben PHP için bulabildiğim en popüler yaş funcs 3 tür 100 yıl karşılaştırma koştu ve benim sonuçları (yanı sıra fonksiyonları) bloguma gönderdi .

Gördüğünüz gibi orada her 3 Funcs 2 fonksiyonu üzerine sadece hafif bir fark ile iyi preform. Sonuçlarıma dayalı önerim, bir kişinin doğum gününde özel bir şey yapmak istemiyorsanız 3. işlevi kullanmaktır, bu durumda 1. işlev tam olarak bunu yapmak için basit bir yol sağlar.

Test ile küçük bir sorun ve 2. yöntemle başka bir sorun bulundu! Güncelleme yakında blogda! Şimdilik, ikinci yöntem hala çevrimiçi bulduğum en popüler yöntemdir ve yine de en yanlışları bulduğum yöntemdir!

100 yıllık incelememden sonra önerilerim:

Daha uzun bir şey istiyorsanız, böylece doğum günleri ve benzeri günleri dahil edebilirsiniz:

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');

Ancak sadece yaşı bilmek ve daha fazlasını yapmak istemiyorsanız, o zaman:

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

getAge('1980-02-29');

BLOG'a bakın


strtotimeYöntem hakkında önemli bir not :

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 için bir API uzantısı olan Carbonkitaplığı kullanabilirsiniz .

Yapabilirsin:

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

veya:

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

1
Bu daha temiz bir çözümdür, ancak her proje için en iyi olmayabilecek harici bir lib gerektirir
stef

1
Karbon sihirli özelliği sunan agebir yapıyor, diffInYears. Yani şunu yazabilirsiniz:(new \Carbon\Carbon($date))->age
k0pernikus

4

Büyük bir hassasiyete ihtiyacınız yoksa, sadece yıl sayısı, aşağıdaki kodu kullanmayı düşünebilirsiniz ...

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

Bunu sadece bir işleve koymanız ve "1971-11-20" tarihini bir değişkenle değiştirmeniz yeterlidir.

Lütfen, yukarıdaki kodun artık yıllar nedeniyle kesin olmadığını, yani yaklaşık her 4 yılda bir, 365 yerine 366 olduğunu unutmayın. 60 * 60 * 24 * 365 ifadesi, bir yılda saniye sayısını hesaplar - 31536000 ile değiştirin.

Bir diğer önemli şey, UNIX Zaman Damgası'nın kullanılması nedeniyle hem 1901 Yılı hem de 2038 Yılı problemine sahip olmasıdır, bu da yukarıdaki ifadenin 1901 yılından önceki ve 2038 yılından sonraki tarihler için düzgün çalışmayacağı anlamına gelir.

Yukarıda belirtilen sınırlamalarla yaşayabiliyorsanız bu kodun sizin için çalışması gerekir.


time () kullanırsa 2038 "her sistem" çökecek ne olacak?
Miguel

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

1
Çalışmıyor. İşleviniz, 1 Eylül 1990'da doğan birisinin 1 Ekim 1990'da doğan biriyle aynı yaşta olduğunu gösterir - her ikisi için de (2010 - 1990) = 20'yi hesaplardı.
PaulJWilliams

hangi yaş hassasiyetine ihtiyacınız var? ay? gün?
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;
  }

Bazı tarihlerde iyi görünüyor, ancak diğerleri için muhtemelen IF karşılanmadığında hiçbir şey döndürmez?
stef

3

Bu komut dosyasını güvenilir buldum. Tarih biçimini YYYY-aa-gg olarak alır, ancak diğer biçimler için de kolayca değiştirilebilir.

/*
* 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
Lütfen bunun nasıl yardımcı olacağına dair biraz ayrıntı verin. Bir işlevi yapıştırmak, doğru cevap vermenin bir yolu değildir.
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 nesnesini kullanarak bunlardan herhangi birini deneyin

$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/>";

Referans http://www.calculator.net/age-calculator.html


3

Bir kişinin geçerli yaşını hesaplamak için bir PHP komut dosyası yazın.

Örnek doğum tarihi: 11.4.1987

Örnek Çözüm:

PHP Kodu:

<?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");
?>

Örnek Çıktı:

Yaşınız: 30 yıl, 3 ay, 0 gün


2

bu, yıl, ay ve güne göre belirli bir yaş dönüşü ile DOB'u hesaplama işlevimdir

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 );
}

bu nasıl kullanılır

$ age = ageDOB (1984,5,8); / * yerel saatimle 2014-07-01 * /
echo sprintf ("yaş =% d yıl% d ay% d gün", $ yaş ['y'], $ yaş ['m'], $ yaş ['d']); / * çıktı -> yaş = 29 yıl 1 ay 24 gün * /

2

Bu işlev yaş olarak yıllara dönecektir. Girdi değeri doğum dizesinin biçimlendirildiği (YYYY-AA-GG) gün örn.: 2000-01-01

Gündüz ile çalışır - hassasiyet

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;
}

Şerefe, nira


1

Daha yeni işlevlerden bazılarını kullanamıyorsanız, işte benim uyandırdığım bir şey. Muhtemelen ihtiyacınız olandan daha fazla ve eminim daha iyi yollar var, ancak okunması kolay, bu yüzden işi yapmalı:

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;
    }
}

Örnek Kullanım:

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

Bu yardımcı olur umarım.


1

Artık yıl nedeniyle, sadece bir tarihi diğerinden çıkarmak ve yıllara katlamak akıllıca değildir. Yaşı insanlar gibi hesaplamak için böyle bir şeye ihtiyacınız olacak:

$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

Aşağıdakiler benim için harika çalışıyor ve daha önce verilen örneklerden çok daha basit görünüyor.

$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;
}

Bu kodu test ettim ve aktif olarak kullandım, biraz hantal görünebilir, ancak kullanımı ve düzenlenmesi çok basit ve oldukça doğrudur.


1

İlk mantığın ardından, karşılaştırmada = kullanmanız gerekir.

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

?>

Downvoted. Çalışırken temel matematik yapmak için bir döngü kullanmak verimsizdir.
Wranorn

1

GG / AA / YYYY ile strtotime kullandığınızda bir sorun var. Bu formatı kullanamazsınız. Bunun yerine MM / DD / YYYY (veya YYYYMMDD veya YYYY-AA-DD gibi birçoğunu) kullanabilirsiniz ve düzgün çalışması gerekir.


1

Bu sorguyu başlatma ve MySQL'in sizin için hesaplamasını sağlama hakkında:

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

Sonuç:

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

Kullanıcının 27 yıl 6 ay süresi vardır (tüm ayı sayar)


Bu aslında date_diff ve benzerlerine erişimi olmayan PHP'nin 5.3 öncesi sürümlerindeki insanlar için iyi bir çözümdür.
strangerstudios

1

Ben böyle yaptım.

$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

Bunun en iyi cevabı tamam ama sadece bir kişinin doğduğu yılı hesaplar, gün ve ay çalışmak için kendi amaçlarım için ayarladım. Ama paylaşmaya değer olduğunu düşündüm.

Bu kullanıcıların DOB zaman damgası alarak çalışır, ancak bunu değiştirmek için çekinmeyin

$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

Sadece yaş olarak tamamen yaşlanmak istiyorsanız, bunu yapmanın çok basit bir yolu var. 'YYYYAAGG' olarak biçimlendirilen tarihleri ​​sayı olarak ele alın ve alt özetleyin. Bundan sonra, sonucu 10000 ile bölerek MMDD parçasını iptal edin ve yere koyun. Basit ve asla başarısız olmaz, hatta leapyear'ları ve mevcut sunucu zamanınızı hesaba katar;)

Doğumdan beri veya çoğunlukla doğum yerindeki tam tarihlerle sağlandığından ve GÜNCEL YEREL ZAMAN (yaş kontrolünün gerçekten yapıldığı yer) ile ilgilidir.

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

bu nedenle doğum gününüzde birisinin saat diliminizde (başlangıç ​​saati saatinde) 18 veya 21 veya 100'ün altında olup olmadığını kontrol etmek istiyorsanız, bunu yapmanın yolu budur


0

Bunu dene :

<?php
  $birth_date = strtotime("1988-03-22");
  $now = time();
  $age = $now-$birth_date;
  $a = $age/60/60/24/365.25;
  echo floor($a);
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.