2011-04-23 73 views
1

我正在嘗試重新計劃基於定期方法的重複事件:每日,每週或每月。php - 日期中的星期匹配日期()/ time()

因此,假設我有這樣的數據:

$now = time(); 
    $start_date = '01/01/2011 14:00'; 
    $end_date = '01/01/2011 14:20'; 
    $start_time = date('H:i', $start_date); 
    $end_time = date('H:i', $end_date); 
    $period = $end_date - $start_date; // in this case, 20 minutes 

此事件每天改期是:

$new_time_start = strtotime(date("m/d/Y {$start_time}", $now)); 
    $new_time_end = $new_time_start + $period; 

和月:

$start_day = date('d', $start_date); 
    $new_time_start = strtotime(date("m/{$start_day}/Y {$start_time}", $now)); 
    $new_time_end = $new_time_start + $period; 

這似乎是工作,但我不知道如何爲每週活動做同樣的事情:(

例如'01/01/2011'是星期六,所以我想重新安排這個活動每個星期六(根據PHP一週的第6天)運行。

任何想法?

+3

我建議將此任務傳遞給cronjob。 – 2011-04-23 08:49:40

+0

我不知道這是如何相關的,因爲這是我試圖用PHP構建的事件日曆的一部分... – Alex 2011-04-23 08:52:02

+0

您可以使用'mktime()'函數來構造日期。 – JohnP 2011-04-23 08:52:22

回答

1

試試這個...

$today = date('w'); 
$day = date('w', $start_date); 
$diff = abs(7 - ($today - $day)); 
$new_time_start = strtotime('+'.$diff.'days', strtotime(date("m/d/Y {$start_time}"))); 
$new_time_end = $new_time_start + ($end_date - $start_date); 

它好像你缺少一些的strtotime()在你的$起始日期包裝和$ END_DATE值。我假設你將開始和結束日期變量存儲爲unix時間戳,所以我沒有將它們包含在我的代碼中。另外,就像附註一樣,您不必在date()中輸入time()作爲第二個參數。如果時間值丟失,它將使用當前時間。所以你可以刪除所有$現在的實例,它仍然可以工作。

+0

它的工作原理!謝謝:D – Alex 2011-04-23 09:21:35

+0

唯一要補充的是,你需要檢查事件是否需要重新調度:'if($ now> $ end_date)...'(所以它不會重新安排將來開始的事件) – Alex 2011-04-23 09:29:04

1

我不太確定我理解你的問題,但難道你不能這樣做嗎?

$time  = '2011-01-31'; 
$weekLater = date('Y-m-d', strtotime('+7 days ' . $time)); 
echo $time . ' -> ' . $weekLater; 

Output : 2011-01-31 -> 2011-02-07 

無論你給它什麼日期,它會給你日期7天的日期。這是你需要的嗎?