2014-06-06 89 views
1

我的數據庫中有列'出生日期',用戶以「Y-m-d」格式填寫。計算出生日和當天之間的天差

現在我想回聲總剩餘天數希望用戶生日快樂。

E.g.如果當前日期是2014-06-06和用戶出生日期是1980-06-26,那麼生日即將到來6月26日,代碼應回聲「生日是20天后」

我試過的是如下 -

$date1= date("m-d"); 
$date2=date("m-d",strtotime($data['birthdate'])); 

$dateDiff = abs(strtotime($date2) - strtotime($date1)); 
$remainedDays = floor($dateDiff/(60*60*24)); 

echo "Birthday Is After $remainedDays Days"; 

但是這個代碼是給0天

+1

使用DateTime類更好。 –

+0

這與MySQL有什麼關係?如果沒有,請刪除標籤。 –

+0

Abhik,我發佈了一個使用下面的DateTime類的解決方案。 –

回答

3

最低冗長的方式做,這是與DateTime classes,並專門與DateTime::diff method。請注意,您應該確保每個日期的時間都是午夜,然後測試今年的生日是否已經發生。

<?php 
$birthday = "1980-06-24"; 

// get date of birthday this calendar year 
$parts = explode('-', $birthday, 2); 
$birth_date = new DateTime(date('Y') . '-' . $parts[1] .' 00:00:00'); 
$today = new DateTime('midnight today'); 

if ($birth_date < $today) { 
    // next birthday is in one year 
    $birth_date->modify("+1 Year"); 
} 

// get number of days days remaining 
$diff = $birth_date->diff($today); 

if ($diff->days > 0) { 
    echo "There are " . $diff->days . " remaining until your birthday."; 
} else { 
    echo "Happy birthday!"; 
} 
+0

它完美適合我... !!!非常感謝您的幫助 – darshan

+0

不客氣,我很樂意提供幫助。在php中處理日期和時間可能會很棘手,但DateTime擴展簡化了很多事情。我討厭看到人們仍然使用strtotime()和更舊的函數。如果你在日期上工作很多(並且最終你會這樣做),Derrick Rethan關於[日期和時間編程指南]的書(http://www.phparch.com/books/phparchitects-guide-to-date-and-time - 編程/)是一個很好的參考。 –

+0

Ohh..yes ..謝謝!我會明確地閱讀這本書。 – darshan

0

這是一種算法可用於即將到來的B'days。這也將考慮與B'day閏年作爲02/29

您可以修改代碼根據需要按照您的要求。它將檢查即將到期的B'day或B'day,它已經過期。

$bday = new DateTime("1980-06-26"); 
$today = new DateTime(); 
$b_y = $bday->format('Y'); 
$b_d = $bday->format('d'); 
$b_m = $bday->format('m'); 

if((bool)$bday->format('L') && $b_d == 29 && $b_m == 2){ 
    if((bool)$today->format('L')){ 
    $bday_obj = new DateTime(date('Y').'-'.$b_m.'-'.$b_d); 
    $diff = $bday_obj->diff($today); 
    }else{ 
    for($i=1;$i++;$i<=3){ 
     $today->add(new DateInterval('P1Y')); 
     if((bool)$today->format('L')){ 
     $bday_obj = new DateTime(date('Y').'-'.$b_m.'-'.$b_d); 
     $diff = $bday_obj->diff($today); 
     break ; 
     } 
    } 
    } 
}else{ 
    $bday_obj = new DateTime(date('Y').'-'.$b_m.'-'.$b_d); 
    $diff = $bday_obj->diff($today); 
} 

$now = new DateTime() ; 
if($now > $bday_obj){ 
    echo 'Your birthday was over '.$diff->format('%a days').' before'; 
}else{ 
    echo 'Your birthday is after '.$diff->format('%a days'); 
}