2016-01-07 3 views
1

Я работаю над системой школьных расписаний и в настоящее время разрабатываю скрипт PHP, который позволит экспортировать данные в формате iCalendar (.ics). Целевой прецедент экспорта данных будет импортировать его в Календарь Google.iCalendar исключить диапазон дат

Поскольку праздники Inbetween семестров в нашей школе (определяется по дате начала и окончания), , что было бы лучшим способом, чтобы исключить праздники из правила повторения Анонсы (RRULE)?. Имейте в виду, что в одном экспорте может быть много разных расписаний.

Я пробовал использовать EXDATE;VALUE=DATE:YYYYMMDD,YYYYMMDD,YYYYMMDD... со всеми праздничными днями, но Календарь Google не исключал даты, вероятно, потому, что графики также имеют время, и поэтому они не совпадают.

Я также предоставлять данные в формате с одним Анонсы событий, с праздником дней исключенных один на один (тот, который не работал)

BEGIN:VCALENDAR 
PRODID:-//Gregor Eesmaa/NONSGML Poska timetables//ET 
VERSION:2.0 
METHOD:PUBLISH 
BEGIN:VEVENT 
UID:[email protected] 
SUMMARY:French 
DESCRIPTION: 
LOCATION:Room 210 
DTSTART:20151215T123000Z 
DTEND:20151215T134500Z 
RRULE:FREQ=WEEKLY;UNTIL=20160211;INTERVAL=1;BYDAY=TU 
EXDATE;VALUE=DATE:20151223,20151224,20151225,20151226,20151227,20151228,20151229,20151230,20151231,20160101,20160102,20160103,20160104,20160105,20160106,20160107,20160108,20160109,20160110,20160319,20160320,20160321,20160322,20160323,20160324,20160325,20160326,20160327,20160415,20160416,20160417,20160418,20160607,20160608,20160609,20160610,20160611,20160612,20160613,20160614,20160615,20160616,20160617,20160618,20160619,20160620,20160621,20160622,20160623,20160624,20160625,20160626,20160627,20160628,20160629,20160630,20160701,20160702,20160703,20160704,20160705,20160706,20160707,20160708,20160709,20160710,20160711,20160712,20160713,20160714,20160715,20160716,20160717,20160718,20160719,20160720,20160721,20160722,20160723,20160724,20160725,20160726,20160727,20160728,20160729,20160730,20160731,20160801,20160802,20160803,20160804,20160805,20160806,20160807,20160808,20160809,20160810,20160811,20160812,20160813,20160814,20160815,20160816,20160817,20160818,20160819,20160820,20160821,20160822,20160823,20160824,20160825,20160826,20160827,20160828,20160829,20160830,20160831 
LAST-MODIFIED:20160102T123758Z 
DTSTAMP:20160107T232137Z 
END:VEVENT 
END:VCALENDAR 
+0

Не уверен, что вы делаете неправильно. Я бы рекомендовал создать более простой файл iCal, который вы можете использовать для тестирования, просто чтобы выяснить, как это сделать правильно. Затем, как только вы заработаете для простого примера, примените то, что вы узнали, к реальной проблеме. – Michael

ответ

0

Я отправил этот вопрос в поисках решения, которое исключало бы целые диапазоны. После тщательного рассмотрения я решил сделать это правильно, исключив только даты, когда событие действительно состоится. Это уменьшило размер файла экспорта в три раза.

Я также добавил информацию о часовом поясе, рекомендованную для использования RRULE. Теперь урок французского урока будет выглядеть так:

BEGIN:VEVENT 
UID:[email protected] 
SUMMARY:French 
DESCRIPTION: 
LOCATION:Room 210 
DTSTART;TZID=Europe/Tallinn:20151215T143000 
DTEND;TZID=Europe/Tallinn:20151215T154500 
RRULE:FREQ=WEEKLY;UNTIL=20160211;INTERVAL=1;BYDAY=TU 
EXDATE;TZID=Europe/Tallinn:20151229T143000,20160105T143000 
CREATED:20160102T123758Z 
LAST-MODIFIED:20160102T123758Z 
DTSTAMP:20160108T115122Z 
END:VEVENT 
0

На основании этого другого SO issue, его похоже, вы не устанавливаете ни одну исключенную дату в EXDATE. EXDATE может быть установлен на DATE, основанный на RFC 5545 specificaiton.

На основании ответа на другой вопрос, ваш EXDATE должен был

EXDATE:20151223,20151224,20151225,20151226,20151227,20151228,20151229,20151230,20151231,20160101,20160102,20160103,20160104,20160105,20160106,20160107,20160108,20160109,20160110,20160319,20160320,20160321,20160322,20160323,20160324,20160325,20160326,20160327,20160415,20160416,20160417,20160418,20160607,20160608,20160609,20160610,20160611,20160612,20160613,20160614,20160615,20160616,20160617,20160618,20160619,20160620,20160621,20160622,20160623,20160624,20160625,20160626,20160627,20160628,20160629,20160630,20160701,20160702,20160703,20160704,20160705,20160706,20160707,20160708,20160709,20160710,20160711,20160712,20160713,20160714,20160715,20160716,20160717,20160718,20160719,20160720,20160721,20160722,20160723,20160724,20160725,20160726,20160727,20160728,20160729,20160730,20160731,20160801,20160802,20160803,20160804,20160805,20160806,20160807,20160808,20160809,20160810,20160811,20160812,20160813,20160814,20160815,20160816,20160817,20160818,20160819,20160820,20160821,20160822,20160823,20160824,20160825,20160826,20160827,20160828,20160829,20160830,20160831 

Надежда это помогает!

+0

В соответствии со спецификацией мое форматирование верное, как указано: 'exdate =" EXDATE "exdtparam": "exdtval * (", "exdtval) CRLF', где' exdtparam = ... (";" "VALUE" " = "(" DATE-TIME "/" DATE ")) ...'. Кроме того, ваше предложение не позволяло Google Календарю показывать графики праздников. –

1

Если DTSTART является значением даты и времени, то EXDATE также должны быть датами. Я предлагаю вам добавить T123000Z к каждому из ваших EXDATE, чтобы они фактически указывали на запуск действительных экземпляров. Затем они будут правильно исключены.