2015-08-22 24 views
0

我有一個既是「靜態」(在特定的一天)和「經常性」(從特定日子開始,但設置爲「每週或每隔一週」重複出現)的事件的數據庫。我知道需要7和14的時間間隔,但我不知道如何到達這一點,找到一個日期>今天並吐出來。PHP - 找到未來的未來重複日期?

so example;

我想查找下一個即將發生的週期性事件並吐出相關日期。附註:我卡住的數據是Ymd的字符串(我知道,因此20150821將是2015年8月21日)。

如果今天是2015年8月21日,並且有「每個其他人星期五「8月7日開始,這將是+14這將讓你到今天,8月21日星期五。

但是說有一個」每週三「8月19日開始,我想要得到星期三,8月26日,吐出來。

這將需要在未來的無限日期工作,開始日期永遠不會改變。

所以運行腳本在2016年1月1日,我需要知道的是,下一個「每個星期三」是1月6日2016年

僞代碼:

if(start_date < today_date) { 
    // start date is in the past 
    add recurring_inverval to start_date until result >= today_date 
    echo result 
} elseif(start_date > today_date { 
    // start date is in the future 
    echo start_date 
} 

它的加入,直到找到x我失去了。不知道如何在if語句中做到這一點。

也不知道這是否是最好的方式去做。我知道PHP也可以做複雜的字符串並將它們轉換爲日期。像「下週六」

回答

0

解決它自己:

$begin = new DateTime($start_date); // start searching on the start date of the event 
$end = new DateTime(date('Ymd')); // end on today's date 
$end = $end->modify('+1 month'); // extend search to the next month 

$interval = new DateInterval('P'. $freq_math .'D'); // intervals of Plus X Days - uses frequency math of 7 or 14 for every or every other 
$daterange = new DatePeriod($begin, $interval, $end); 


foreach($daterange as $date) { 
    if($date->format('Ymd') >= date('Ymd')) { 
     $next_recurring_date = $date->format('Ymd'); 
     break; 
    } 
} 

echo $next_recurring_date; 
1

我知道你這樣回答自己,但另一種選擇是隻使用當前日期的模量(等分後的餘額)減去開始日期計算你的下一個日期。這裏是一個快速的腳本來做到這一點:

<?php 
function nextDate($start_date,$interval_days,$output_format){ 
    $start = strtotime($start_date); 
    $end = strtotime(date('Y-m-d')); 
    $days_ago = ($end - $start)/24/60/60; 
    if($days_ago < 0)return date($output_format,$start); 
    $remainder_days = $days_ago % $interval_days; 
    if($remainder_days > 0){ 
     $new_date_string = "+" . ($interval_days - $remainder_days) . " days"; 
    } else { 
     $new_date_string = "today"; 
    } 
    return date($output_format,strtotime($new_date_string)); 
} 
echo nextDate('20151210',14,'Ymd') . "<br />"; 
echo nextDate('20150808',14,'Ymd') . "<br />"; 
?> 

你也不想返回早日如果「開始日期」是在遙遠的未來。更新代碼以防止這種情況。