2010-03-23 58 views
2

我有一個timestamp格式的開始和結束時間。我想把它們分成例如1小時的時隙。開始和結束時間,分爲1小時段

$t1 = strtotime('2010-05-06 12:00:00'); 
$t2 = strtotime('2010-05-06 18:00:00'); 

$timeslots = array(); 

while ($t1 < $t2) { 
$t1 = $t1 + 3600; 
$timeslots[] = $t1; 
} 

foreach ($timeslots as $slot) { 
echo date("Y-m-d H:i:s", $slot) . '<br/>'; 
} 

這是最有效的方法嗎?還是有更好的方法來做到這一點?

有時當用其他數字對不同長度的時隙進行嘗試時,出現致命錯誤:允許的內存大小被耗盡,這讓我覺得它不是非常有效。雖然不會出現現在要發生的事情......

(我建立一個系統正預約)

+0

你只需要打印出來,或者你需要別人以後使用「時隙」的東西? – lamas

+0

我會將它們放入MySQL數據庫,然後將預訂分配給每個時隙。 – deadlyhifi

+0

允許的內存大小耗盡報告也是發生錯誤的行。你爲什麼不在這裏發佈這一行? –

回答

6

你試過

while ($t1 < $t2) { 
    $t1 = strtotime('+1 hour', $t1); 
    $timeslots[] = date('Y-m-d H:i:s', $t1); 
} 

foreach ($timeslots as $slot) { 
    echo $slot . '<br/>'; 
} 

有點相同,但乾淨。正如所說strtotime將處理日期變化,如閏年。你的PHP內存限制是多少?可能太低了。

+0

致命錯誤:允許內存大小爲25165824字節耗盡(試圖分配71個字節)。 – deadlyhifi

+0

你可以嘗試將php內存限制設置爲32M嗎? – Kevin

+0

我沒有訪問權限,但現在看起來工作正常。謝謝大家的幫助。 – deadlyhifi

0

不是

$t1 = $t1 + 3600; 

你會用

$t1 = strtotime('+1 hour', $t1); 

更好後者將被調整到夏令時,閏年等

否則,你的代碼看起來精細。如果內存不足,可能是由於無限循環。您可能想要添加代碼以確保$ t2大於$ t1,並在它們不是時切換它們。使用

+0

好想法。 *應該*永遠不會發生,但發生了陌生的事情。 – deadlyhifi

+0

對。很多不應該發生的事情發生得相當頻繁。另外,您可能需要檢查strtotime()調用的結果。如果輸入不好,它會返回false或-1(取決於你的PHP版本),這也可能導致你的循環。 –

0

PHP 5.3

$dateTimes = new DatePeriod(
    new DateTime($start), 
    new DateInterval('PT1H'), 
    new DateTime($end) 
); 

foreach ($dateTimes as $dt) { 
    echo $dt->format('Y-m-d H:i:s'), "\n"; 
} 
+0

這很有趣。我還沒有5.3,但很高興知道。 – deadlyhifi

相關問題