首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 根據出生日期精確計算年齡的兩種方法

     編輯:PHP 綜合知識

計算年齡看似簡單,實則涉及閏年、月日比較等邊界情況。本文提供兩種健壯的 PHP 實現:時間戳法與日期拆分法,均正確處理「生日是否已過」邏輯。

方法一:時間戳 + 日期拆分(推薦,可讀性強)

function getAge(string $birthday): int|false {
    $ts = strtotime($birthday);
    if ($ts === false) return false; // 格式無效

    [$y1, $m1, $d1] = explode('-', date('Y-m-d', $ts));
    [$y2, $m2, $d2] = explode('-', date('Y-m-d'));

    $age = $y2 - $y1;
    // 如果今年的生日還沒到,年齡 -1
    if (($m2 . $d2) < ($m1 . $d1)) $age--;

    return $age;
}

// 測試
echo getAge('1990-05-15'); // 假設今天 2024-03-10 → 33
echo getAge('2010-02-29'); // 閏年出生,非閏年按 2/28 或 3/1 算,邏輯自動處理

方法二:直接比較月日(更簡潔)

function getAgeSimple(string $birthday): int {
    [$by, $bm, $bd] = explode('-', $birthday);
    $cy = (int)date('Y');
    $cm = (int)date('m');
    $cd = (int)date('d');

    $age = $cy - $by;
    if ($cm < $bm || ($cm == $bm && $cd < $bd)) $age--;

    return $age;
}

DateTime 物件導向寫法(PHP 5.3+,最優雅)

function getAgeOOP(string $birthday): int {
    $birth = new DateTime($birthday);
    $today = new DateTime('today');
    $diff  = $birth->diff($today);
    return $diff->y; // DateInterval 的 y 屬性已自動處理生日是否已過
}

// 使用
echo getAgeOOP('1995-12-25');

邊界測試用例

出生日期今天預期年齡說明
2000-01-012024-01-0124生日剛好今天
2000-01-012023-12-3123生日尚未到
2012-02-292024-02-2811閏年出生,非閏年 2/28 視為生日已過
2012-02-292024-03-0112閏年,生日 2/29 已過
invalid--false格式錯誤返回 false

常見錯誤避坑

  • ❌ date('Y') - date('Y', strtotime($birthday)):忽略月日,會導致生日未到時年齡偏大 1 歲。
  • ❌ 直接用 floor((time() - strtotime($birthday)) / 31536000):忽略閏年、月長差異,誤差累積。
  • ✅ 使用 DateTime::diff():內部已正確處理日曆邏輯,代碼最簡潔、可維護性最強。

擴展:計算虛歲/周歲/下次生日倒計時

$birth = new DateTime('1990-05-15');
$today = new DateTime('today');

// 虛歲:出生即 1 歲,每過一年 +1
$xusui = $today->diff($birth)->y + 1;

// 下次生日
$nextBirthday = clone $birth;
$nextBirthday->setDate((int)$today->format('Y'), (int)$birth->format('m'), (int)$birth->format('d'));
if ($nextBirthday <= $today) $nextBirthday->modify('+1 year');
$daysLeft = $today->diff($nextBirthday)->days;

echo "周歲: {$today->diff($birth)->y}, 虛歲: $xusui, 距離下次生日: $daysLeft 天";

推薦在項目中統一使用 DateTime 系列類,避免手動拼接字符串比較帶來的隱患。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved