2011-04-23 74 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天的日期。这是你需要的吗?