2012-07-28 45 views
2

我在寫每週星期一迭代的php腳本。爲什麼迭代數週會出現PHP日期錯誤?

但是,腳本似乎在10月22日後不同步。

<?php 

$october_8th = strtotime("2012-10-08"); 

$one_week = 7 * 24 * 60 * 60; 

$october_15th = $october_8th + $one_week; 
$october_22nd = $october_15th + $one_week; 
$october_29th = $october_22nd + $one_week; 
$november_5th = $october_29th + $one_week; 

echo date("Y-m-d -> l", $october_8th) . '<br />'; 
echo date("Y-m-d -> l", $october_15th) . '<br />'; 
echo date("Y-m-d -> l", $october_22nd) . '<br />'; 
echo date("Y-m-d -> l", $october_29th) . '<br />'; 
echo date("Y-m-d -> l", $november_5th) . '<br />'; 

這將輸出:

2012-10-08 -> Monday 
2012-10-15 -> Monday 
2012-10-22 -> Monday 
2012-10-28 -> Sunday 
2012-11-04 -> Sunday 

我希望它說十月29日,但它得到停留在第28位。

我該如何解決這個問題?

回答

5

首選的方法是使用PHP的日期相關類來獲取日期。

這些類爲您處理日光節約邊界很重要,可以手動將給定秒數添加到Unix時間戳(您使用的strtotime()的數字)不能。

以下示例將開始日期和循環四次,每次將日期添加一週。

$start_date = new DateTime('2012-10-08'); 
$interval = new DateInterval('P1W'); 
$recurrences = 4; 

foreach (new DatePeriod($start_date, $interval, $recurrences) as $date) { 
    echo $date->format('Y-m-d -> l') . '<br/>'; 
} 

PHP手冊鏈接:

+0

謝謝你,這的確是完美的解決方案我一直在尋找。 – 2012-07-28 13:08:15

+0

非常歡迎。玩得開心玩這些課程。 – salathe 2012-07-28 13:08:54

1

在寫這個問題的時候,我發現當天的節能時間在10月28日結束。

由於初始化日期不包含特定時間自動分配午夜。然而,這在夏日結束時會產生問題。突然之間的時間不再是午夜了,而是在那之前的一個小時,因此比你想象的要早一天。

一個簡單的解決將是初始化是中午,而不是午夜時間:

$october_8th = strtotime("2012-10-08 12:00"); 

也許有可能是更好的解決方案(歡迎您留下一個),但這將爲此做目的。