2013-03-12 20 views
0

我的客戶希望我使用存儲在mysql中的出生日期顯示孩子的年齡。由於該網站未限制用戶輸入此日期的方式,因此我以前的代碼不適用於所有格式。以下是我目前爲止的內容,但我無法確定如何檢查格式。他們有mm/dd/yyyy,mm/dd/yy,dd/mm/yyyy,dd/mm/yy,Abbrev day, yy,Abbrev day, yyyy的生日。他們還使用不同的分隔符,如.-,這很容易檢查並使用爆炸。從任何格式存儲的出生日期查找年齡php

$birthday=//data from db 
$DOB=$birthday; 

if(strpos($DOB,'/')){ 
    list($month,$day,$year)=explode('/',$DOB); 
    if(strlen($year)=='4'){ 
    //year is in Y format 
    $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("Y")-$year)-1):(date("Y")-$year)); 
    }else{ 
    if(strlen($month)=='4'){ 
     //format is adjusted using ymd - $month is actually the year, the $day is month, the $year is the day 
     $age = (date("md", date("U", mktime(0, 0, 0, $day, $year, $month))) > date("md") ? ((date("Y")-$month)-1):(date("Y") -$month)); 
    }else{ 
     //year is in y format 
     $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("y")-$year)-1):(date("y")-$year)); 
    } 
    } 
}elseif(strpos($DOB,'-')){ 
    list($month,$day,$year)=explode('-',$DOB); 
    if(strlen($year)=='4'){ 
    //year is in Y format 
    $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("Y")-$year)-1):(date("Y")-$year)); 
    }else{ 
    if(strlen($month)=='4'){ 
     //format is adjusted using ymd - $month is actually the year, the $day is month, the $year is the day 
     $age = (date("md", date("U", mktime(0, 0, 0, $day, $year, $month))) > date("md") ? ((date("Y")-$month)-1):(date("Y") -$month)); 
    }else{ 
     //year is in y format 
     $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("y")-$year)-1):(date("y")- $year)); 
    } 
    } 
}elseif(strpos($DOB,'.')){ 
    list($month,$day,$year)=explode('.',$DOB); 
    if(strlen($year)=='4'){ 
    //year is in Y format 
    $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("Y")-$year)-1):(date("Y")-$year)); 
    }else{ 
    if(strlen($month)=='4'){ 
     //format is adjusted using ymd - $month is actually the year, the $day is month, the $year is the day 
     $age = (date("md", date("U", mktime(0, 0, 0, $day, $year, $month))) > date("md") ? ((date("Y")-$month)-1):(date("Y") -$month)); 
    }else{ 
     //year is in y format 
     $age = (date("md", date("U", mktime(0, 0, 0, $month, $day, $year))) > date("md") ? ((date("y")-$year)-1):(date("y")- $year)); 
    } 
    } 
}else{} 

echo $age; 

} 
+0

你如何處理03/03/1995?你是否保存每個日期的格式? – 2013-03-12 20:26:38

+1

爲什麼strtotime()不起作用? – 2013-03-12 20:27:32

+1

@Akam,03/03/1995是3月3日。 :)但是你一般都是對的,只是使用了不好的例子。那麼,user2162686,如果你有03/04/1995存儲?它是4月還是4月,3日?只有兩種方法可以處理它:(1)在數據庫中允許的格式(但不一定在UI中)只允許一個格式或(2)與日期並排存儲格式。對你的特殊情況更好 - 這取決於你自己決定。 – J0HN 2013-03-12 20:39:32

回答

0

你可以希望做的最好的事情是strtotime()。所以下面是計算年齡的代碼:

$birthday = // value from db 
$birthdayTime = strtotime($birthday); 

$age = date('Y') - date('Y', $birthdayTime); 

if (date('md') < date('md', $birthdayTime)) { 
    // we haven't reached their birthday this year so subtract one 
    $age--; 
} 

echo $age; 

我們在代碼中做了什麼。首先,我們將字符串生日轉換爲unix時間戳。起初以爲人們可能希望從當前時間戳中減去時間戳併除以一年中的秒數,但因爲這不包括閏年,並且會在2月底/ 3月初附近生日帶來時髦結果我們所做的是從當年減去出生年份,然後檢查我們是否有一年的生日。如果我們沒有,那麼我們減去1並且我們得到年齡。

如果你的數據庫允許dd/mm/yy和mm/dd/yy,如果01/02/03是1月2日或2月1日,則100%是不可能的。因此,在修復數據之前,您會遇到一些小問題。

你也可以嘗試做出有根據的猜測mm/dd/yy更像是美式日期格式,而dd/mm/y更像是一種無處不在的美式日期格式,所以你可以嘗試更新數據庫數據的方式。