2011-03-07 25 views
3

我有一個計算的開始/結束時間,我正在嘗試執行,並且遇到問題,看看結束時間是否在開始時間之後的第二天12點之前。另外,我需要計算它在開始時間之後的多少天。計算多少'Midnights'是PHP中的另一個日期?

我有什麼:開始日期,結束日期

我需要什麼: - 有多少「午夜」是結束日期過去的開始日期?

有沒有人做過類似的事情?

回答

4

這使用PHP 5.3,如果您有早期版本,您可能需要使用unix時間戳找出差異。假設開始和結束時間都是同一時間,那麼中午的數量應該是天數的差異。因此,將兩者都設置爲當天的午夜setTime(0,0)應該使計算正確。

使用DateTime對象。

$start = new DateTime('2011-03-07 12:23:45'); 
$end = new DateTime('2011-03-08 1:23:45'); 

$start->setTime(0,0); 
$end->setTime(0,0); 

$midnights = $start->diff($end)->days; 

如果不使用setTime()調用,這將導致0,因爲那裏是起點和終點之間少於24小時。與setTime()這導致1,因爲現在的差異正好是24小時。

diff()函數與DateInterval類一起在5.3中引入。在5.2中,您仍然可以使用DateTime類,但必須使用Unix時間戳計算總日數。

$midnights = ($end->format('U') - $start->format('U'))/86400 

你可以用,在一個abs()功能開始/結束的順序並不重要。

注意:這些功能可能需要針對涉及DST的情況進行測試。

php date documentation中的評論在除以86400(一天中的秒數)之後使用一輪,以解決可能與DST有關的任何問題。

DateTimes的替代方法是在UTC中創建它們。

$utcTimezone = new DateTimeZone('UTC'); 
$start = new DateTime('2011-03-07 12:23:45', $utcTimezone); 
$end = new DateTime('2011-03-08 1:23:45', $utcTimezone); 
+0

我們正在使用5.2.10,但我會研究類似的東西。謝謝! – wajiw 2011-03-07 02:42:08

+0

唯一不能使用的就是最後一行。我用5.2替代更新答案。 – Jacob 2011-03-07 02:45:47

+0

非常感謝您的幫助。我將在實施後更新答案 – wajiw 2011-03-07 02:49:57