2017-09-22 29 views
0

我已經創建了一個PHP腳本來從我的郵件服務器讀取一個文件。該腳本用於規劃我的PBX中的事件,因此當人們打電話而我不在辦公室時,它會自動將它們重定向到語音郵件。這適用於一次性事件,但我希望它適用於重複性事件。ical file recurring events

這是腳本的結果:

[BEGIN] => VEVENT 
[DTSTAMP] => 20170920T120736Z 
[UID] => 80462778A326E04EBD831336D01F2A2F179EBCBCC8BD7A45954DE9CF 
[DESCRIPTION] => \n 
[PRIORITY] => 5 
[SUMMARY] => Summary 
[CLASS] => PUBLIC 
[LOCATION] => Place 
[X-ALARM-TRIGGER] => -PT30M 
[DTSTART] => 20170912T083000 
[DTEND] => 20170912T173000 
[RRULE] => FREQ=WEEKLY;BYDAY=TU 
[END] => VEVENT 

我能夠識別出該「RRULE」參數重複發生的事件,但認爲它通過腳本將不得不計算重複日期和將採取我猜很多CPU。特別是因爲我的文件已經有超過1800個事件,這些都必須檢查。然後還有如何檢查這個問題,因爲經常性事件可以是每天,每週,每月,每年,而且沒有間隔,例如,每隔一週。

關於如何去做這件事的任何想法?

回答

1

給這樣的一個嘗試

<?php 

$recur = 'FREQ=WEEKLY;BYDAY=TU'; 
$ex = explode(';', $recur); 
$freq = str_replace('FREQ=','',$ex[0]); 
$day = str_replace('BYDAY=','',$ex[1]); 

$dates = []; 

switch ($freq) { 
    case 'WEEKLY': 
     $date = new DateTime(); // set to correct day obvs 
     $dates[] = $date; 
     for ($x = 0; $x <= 52; $x ++) { 
      $date = clone $date; 
      $date->modify('+1 week'); 
      $dates[] = $date; 
     } 
     break; 
} 

foreach($dates as $date) { 
    echo $date->format('Y-m-d')."\n"; 
} 

你需要自己剩下的代碼,但是這產生了一堆日期一週彼此分開。

看到它在這裏工作https://3v4l.org/Dgriv

+0

,實際工作很好,但是如果是超過52星期裏發生的事件?我無法循環循環,因爲最終它將不得不循環多年。 – vespino