2012-01-08 37 views
0

我正在構建一個PHP註冊系統,需要創建一個以出生日期(作爲時間戳)並返回(4月31日)的年齡的函數。我現在擁有的是:使用PHP創建調整後的年齡

<?php 
function get_adj_age($dob) 
{ 
    $age = (time()-$dob); 
    $today = strtotime(date('F d', time())); 
    $diff = ($cutoff - $today); 
    $adj_age = floor(($age+$diff)/31556926); 

    return $adj_age; 
} 

由於某種原因,這打破了我的大腦。任何人都在關注我嗎?乾杯。

+0

您確定發佈了整個功能嗎?我懷疑'返回$ adj_age;'做超出函數範圍的任何東西(除非在包含文件中時引發錯誤)。 – 2012-01-08 07:53:55

+1

$ cutoff沒有在任何地方定義,所以它會產生一個警告,並被視爲null/0,所以$ diff只是「今天的負數$」。而4月31日如何涉及這個功能?它不在任何地方使用。另外使用31556926代表365.25天。祝賀閏年,但boooooo使用這種醜陋的數學。 – 2012-01-08 07:56:03

+0

'$ today'應該只是'time()'的返回值而不是'strtotime()'調用。 – anubhava 2012-01-08 07:57:05

回答

5
function adjustedAge($dob, $adjustTo = 'April 31') { // DOB can be of any format accepted by strtotime() 
    return ((new DateTime($adjustTo.', '.date('Y')))->diff(new DateTime($dob)))->y; 
} 

從本質上講這是什麼它創造了當年四月31日提供DateTime對象,然後減去人出生日期。這導致DateInterval從中檢索並返回年份。

+0

+1更可讀和簡單的代碼。 – anubhava 2012-01-08 08:00:55

+0

爲什麼4月31日? – deceze 2012-01-08 08:04:55

+0

@deceze因爲這是OP提到的日期 – 2012-01-08 08:10:03

-1

這很簡單。首先獲取當前時間並將其存儲在一個變量中。然後以毫秒爲單位計算年齡(考慮到1969年以前的時間戳是負的,因此三元運算符)。年齡是現在以毫秒爲單位,因此受到的毫秒數在一年(60 * 60 * 24 * 365)

function getAge($birth){ 
    $t = time(); 
    $age = ($birth < 0) ? ($t + ($birth * -1)) : $t - $birth; 
    return floor($age/31536000); 
} 

把它要獲得特定日期的年齡只需創建所需的天時間戳而不是使用當前時間。

$t = mktime(0, 0, 0, 4, 31, 2012); // <-- April 31st, 2012 
+0

爲什麼要幾毫秒? PHP的本地時間戳是自1970年1月1日以來的標準unix「秒」。毫秒是Javascript的領土。同樣,'$ t +($ birth * -1)'在數學上與'$ t - $ birth'相同。所以你的$年齡設置爲相同的價值,不管$誕生的價值。你也忘記了閏年。 – 2012-01-08 07:59:47