2011-01-12 70 views
7

Vì vậy, tôi đã dành khá nhiều thời gian nghiên cứu cách tốt nhất để thêm các sự kiện lặp lại vào ứng dụng lịch của tôi.Sử dụng PHP DateInterval để tạo sự kiện lặp lại

Tôi muốn sử dụng hàm DateInterval của PHP và đã xây dựng mã bên dưới để thử và tìm hiểu cách tạo sự kiện lặp lại dựa trên các sự kiện gốc Start Date, Finish DateEndDate of Recurrence.

//user defined event start and finish dates 
$eventStart = new DateTime('2011-01-31 09:00:00'); 
$eventFinish = new DateTime('2011-01-32 17:00:00'); 

//user defined event recurring end date 
$endRecurring = new DateTime('2011-05-31 23:59:59'); 

//define for recurring period function 
$begin = $eventStart; 
$end = $endRecurring; 

//define our interval 
$interval = DateInterval::createFromDateString('next friday'); 
$period = new DatePeriod($begin, $interval, $end, DatePeriod::EXCLUDE_START_DATE); 

//loop through and create new dates for recurring events 
foreach ($period as $dt) 
    $recurringStartDate = $dt->format("l Y-m-d H:i:s\n"); 
    $recurringEndDate = ?NOT SURE HOW TO PROCESS THE END DATE IN THIS START DATE FOREACH LOOP? 

Điều này hy vọng sẽ tạo danh sách ngày bắt đầu sự kiện mới. NHƯNG Tôi cũng cần xác định ngày kết thúc mới cho các sự kiện lặp lại của mình. Làm thế nào để tôi làm điều này? Tôi có cần xử lý điều này trong vòng lặp sự kiện bắt đầu sự kiện không?

Câu hỏi khác của tôi là cách tôi có thể kết hợp nhiều dateIntervals để chăm sóc Repeat every Monday, Wednesday and Friday? Hiện tại chỉ một số ngày tháng duy nhất đang hoạt động như next friday

Cảm ơn sự giúp đỡ của bạn!

Tim

Trả lời

12

Có một ngày/Lịch thư viện đệ quy cho PHP 5.2+ bởi Thomas Planer. Nó không phải DateInterval, nhưng nó có vẻ như là lừa. Hãy khám phá tại số https://github.com/tplaner/When

Tôi biết đây là một câu hỏi cũ, nhưng có lẽ ai đó sẽ được hưởng lợi!

+0

Khi nào tuyệt vời và tôi hiện đang sử dụng nó! – Tim

0

tôi sử dụng strtotime() cho loại điều này. dường như dễ dàng hơn. hoạt động như thế này

$new_timestamp = strtotime('+1 week', time()); // + 1 week from today 
$new_timestamp = strtotime('+1 week', $new_timestamp); // + 2 weeks from now 
$new_timestamp = strtotime('+1 month', $new_timestamp); // + 1 month and 2 weeks from now 

bạn thậm chí có thể bắt đầu với bất cứ chuỗi ngày mà bạn muốn như thế này

$new_timestamp = strtotime('+1 week', strtotime('2011-01-31 09:00:00')); // one week from 2011-01-31 

sau đó bạn có thể ra dấu thời gian ở định dạng bất kỳ sử dụng ngày() chức năng

echo date('Y-m-d', $new_timestamp); 

Hãy để tôi biết nếu bạn có câu hỏi.

+0

Xin chào, Cảm ơn câu trả lời của bạn. Tôi đã xem xét sử dụng strtotime() nhưng nó để lại cho tôi ở vị trí tương tự với các vấn đề trong vòng lặp foreach. Ứng dụng của tôi yêu cầu tôi tạo một loạt các sự kiện định kỳ mà tôi có thể thực hiện cho ngày bắt đầu của mỗi sự kiện định kỳ nhưng không phải ngày kết thúc. Ngoài ra, làm thế nào tôi có thể bó nhiều ngày với nhau để giải quyết vấn đề 'Lặp lại mỗi Thứ Hai, Thứ Tư và Thứ Sáu 'với strtotime()? – Tim

+0

strtotime ('Thứ Sáu tới + 1 tuần')?tìm ra khoảng thời gian giữa bắt đầu và kết thúc, và thêm nó vào ngày bắt đầu mới của bạn. – dqhendricks

+0

lặp lại vào các ngày trong tuần nhất định, bạn phải giữ chúng ở một nơi nào đó và sử dụng bất kỳ thứ gì tiếp theo. bạn có thể xử lý một tuần giá trị của ngày, sắp xếp, sau đó đặt một ở đầu (ngày X tiếp theo sớm nhất). – dqhendricks

6

Hi tôi đã phát triển một cái gì đó tương tự và tôi đã làm chảy:

$event_date = "2012-10-06"; 
$event_end_date = "2012-10-08"; 
$event_repetition_type = "Daily"; 

$date_calculation = ""; 
switch ($event_repetition_type) { 
    case "Daily": 
    $date_calculation = " +1 day"; 
    break; 
case "Weekly": 
    $date_calculation = " +1 week"; 
    break; 
case "Monthly": 
    $date_calculation = " +1 month"; 
    break; 
default: 
    $date_calculation = "none"; 
} 

$dateArray[] = $event_date; 

$day = strtotime($event_date); 
$to = strtotime($event_end_date); 

while($day <= $to) 
{ 
    $day = strtotime(date("Y-m-d", $day) . $date_calculation); 
    $dateArray[] = date("Y-m-d" , $day); 
    } 


//here make above array as key in $a array 
$a = array_fill_keys($dateArray, 'none'); 
print_r($a); 
0

Bạn có thể tính toán một DateInterval trong suốt thời gian của sự kiện người dùng định nghĩa như sau:

$eventStart = new DateTime('2011-01-31 09:00:00'); 
$eventFinish = new DateTime('2011-01-31 17:00:00'); 
$eventDuration = $eventStart->diff($eventFinish); 

sau đó trong vòng lặp của bạn, chỉ cần sao chép ngày lặp đi lặp lại và thêm các tính $eventDuration lại

$until = clone $dt; 
$until->add($eventDuration); 

Ngoài ra, bạn nên thực hiện một số xử lý lỗi khi dữ liệu người dùng cuối của bạn là "2011-01-32"!

Các vấn đề liên quan