ICS-Dateien sind meiner Meinung nach eine wunderbare Sache. Man kann sie beispielsweise an E-Mails anhängen, um Termineinladungen zu verschicken. Die meisten von uns tun das wahrscheinlich ohne zu wissen, dass es sich um eine ICS-Datei handelt. Man kann sie allerdings auch auf Websites platzieren, um Termine zum Import anzubieten. Gerade im Smartphone-Zeitalter sehe ich hierin eine tolle Möglichkeit, den Kunden beispielsweise den nächsten Messetermin oder die nächste Online-Präsentation näher zu bringen. Was einmal im Kalender steht, vergisst man so schnell nicht.

Was ist nun eine solche ICS-Datei? Es ist eine einfache Textdatei (UTF-8 codiert, ohne BOM), welche Informationen im iCalendar-Format enthält. Genaueres zur Geschichte und genaueren Standards lässt sich im Wikipedia-Beitrag zum Stichwort „iCalendar“ nachlesen. Ich möchte hier lediglich einen schnellen, pragmatischen Ansatz zum Umsetzen von Termineinladungen auf Websites leisten – sozusagen von Entwickler zu Entwickler.

Auf den ersten Blick scheint die Sache recht einfach: Textdatei erstellen, gegebenenfalls Inhalte dynamisch oder über das CMS einbinden und fertig. Bei näherer Beschäftigung stieß ich allerdings auf ein paar Parameter, die sich mir nicht sofort erschlossen haben. Daher gehe ich im Folgenden mal eine Beispieldatei durch, um diese zu erklären. Vorweg möchte ich noch sagen, dass ich mich nicht durch die RFCs gekämpft habe – meine Erläuterungen erheben also weder einen Anspruch auf Vollständigkeit noch auf absolute Fehlerfreiheit. Über Kommentare mit Korrekturen, Hinweisen oder Anregungen freue ich mich!

Und noch eine Anmerkung vorweg: Natürlich lässt sich das Beispiel unten sehr stark vereinfachen – nämlich indem man auf die Definition und Verwendung einer Zeitzone verzichtet. Das ist – sofern man sich im nationalen Bereich bewegt – unkritisch und macht die Datei wirklich zu einem Kinderspiel. Es sollte allerdings genau geprüft werden, ob die Zeitzoneninformation wirklich verzichtbar ist.

Veröffentlicht man beispielsweise die Präsenz des eigenen Unternehmens auf einer internationalen Messe, so ist damit zu rechnen, dass Besucher aus anderen Zeitzonen den Termin importieren. Die Kalendersoftware (z.B. Outlook) fragt beim Import nach, wie der Termin anzulegen sei – nach der Zeitzone des Ziels oder nach der eigenen Zone. Ist dem Besucher wichtig, dass er die Zeit „vor Ort“ im Kalender einträgt (um beispielsweise Verkehrsmittel am Zielort zu organisieren) wählt er erstere Option. Ist ihm wichtig, dass die Kollegen genau wissen, von wann bis wann er abwesend ist, entscheidet er sich sinnvollerweise für Option 2.

Doch jetzt endlich zur Sache:

[javascript]BEGIN:VCALENDAR
VERSION:2.0
PRODID:https://www.smitscon.de
BEGIN:VTIMEZONE
TZID:CET
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:Central European Summer Time
DTSTART:20160327T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:Central European Time
DTSTART:20161030T030000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
LOCATION:smitscon Headquarters, Kriftel, Germany
SUMMARY:Schulung ICS-Dateien
DESCRIPTION:Erklärung der Parameter und Formate, Hintergründe zu Zeitzonen
CLASS:PUBLIC
DTSTART;TZID=CET:20160722T090000
DTEND;TZID=CET:20160722T100000
DTSTAMP:20160720T144515
END:VEVENT
END:VCALENDAR[/javascript]

Die ersten beiden Zeilen sind soweit selbsterklärend bzw. sollten genau so übernommen werden.

In Zeile drei findet sich ein frei wählbarer Identifier des Anbieters. Hier empfiehlt es sich, die URL des Anbieters zu verwenden.

Nun definieren wir die Zeitzone in den Zeilen 4ff. Prinzipiell geht das analog den HTML-Tags, wir öffnen mit „BEGIN:VTIMEZONE“ und schließen mit „END:VTIMEZONE“. Dazwischen geben wir einen Bezeichner an (Timezone-ID, TZID). Dieser ist frei wählbar, allerdings muss er unbedingt innerhalb der ICS-Datei konsistent verwendet werden. Ich empfehle daher, mich an die offiziellen Konventionen zu halten. Eine sehr gut aufbereitete Übersicht findet sich unter www.zeitzonen.de.

Da die meisten Zeitzonen eine Art Sommerzeit (Daylight Saving Time) eingeführt haben, wird diese nun zunächst definiert. Also öffnet Zeile 6 die Definition. Die folgenden beiden Zeilen fand ich auf Basis der Informationen, die ich ergoogeln konnte, recht schwer zu verstehen. Ich habe sie mir so übersetzt: Am Tag der Umstellung von Normal- auf Sommerzeit ändert sich die Differenz zu UTC von X zu Y. Der Wert X ist nun so zu formatieren, dass Stunden und Minuten in 24h-Schreibweise direkt hintereinander geschrieben werden. Genauso der Wert Y, der sich in der nächsten Zeile findet.

Anschließend geben wir der hier definierten Sommerzeit einen Namen, Zeile 9.

In der nächsten Zeile, Zeile 10, wird angegeben, zu welchem Zeitpunkt in diese Zeit gewechselt wird. Das Format ist YYYYMMDDTHHMMSS – also das Jahr vierstellig, der Monat zweistellig, der Tag zweistellig. Es folgt fest ein T, dann Stunde, Minute, Sekunde jeweils zweistellig.

Die Zeile 11 ist knifflig. Sie gibt an, in welcher Frequenz dieser Wechsel stattfindet. Daher der Parameter FREQ=YEARLY. BYDAY=-1SU bedeutet, dass es sich um den letzten (-1) Sonntag (SU) im angegebenen Monat handelt. BYMONTH=3 zeigt an, dass im März von Standard- auf Sommerzeit gewechselt wird. Ich bin ziemlich sicher, dass eine ICS-Datei auch ohne diese Zeile funktionieren wird. Aber so ist mein Anspruch auf Vollständigkeit doch ein klein wenig gestiegen.

Damit haben wir schon den ersten Teil der Zeitzonendefinition erledigt. Nehmen wir also mal ein Beispiel – Deutschland. Auf zeitzonen.de finden wir die Zeitzoneninfo zu Deutschland. Hier finden wir den Wert für unsere Zeitzonen-ID (TZID), nämlich CET. Wir könnten auch MEZ nehmen, das ist Geschmackssache. Ich halte mich bei diesen Dingen gerne an die internationale Schreibweise. AfD-Anhänger dürfen gerne die Alternative verwenden. Wir sehen außerdem, dass die Standard-Differenz zu UTC eine Stunde beträgt, zur Sommerzeit zwei Stunden. Also vermerken wir für TZOFFSETFROM +0100 (Bei der Umstellung wird von UTC plus einer Stunde…), für TZOFFSETTO +0200 (…umgestellt zu UTC plus zwei Stunden). Der Name der Sommerzeitzone lautet „Central European Summer Time“, oder „Mitteleuropäische Sommerzeit“ für Beatrix von Storch. Umgestellt wird am 27. März 2016 um 2 Uhr morgens und wir notieren in Zeile 10 den Wert DTSTART 20160327T020000. Mit der Zeile 12 (END:DAYLIGHT) schließen wir die Definition der Sommerzeit ab und wenden uns der Standardzeit zu.

Diese erkläre ich jetzt nicht en detail – ich hoffe, die Grundlagen sind klar. Wir können damit in Zeile 20 mit END:VTIMEZONE die Definition der Zeitzone beenden.

Jetzt kommen wir zum eigentlichen Inhalt des Termins. Der Termin heißt im Terminus der iCalendar-Definition EVENT. Also öffnen wir die Event-Definition mit BEGIN:VEVENT.

Der Event hat einen Ort, somit enthält Zeile 22 die Information zur LOCATION.

Auch die nächste Zeile ist wohl eher selbsterklärend – sie enthält den Titel bzw. die Zusammenfassung (SUMMARY). In Outlook wird dies beispielsweise als Terminname angezeigt.

Im Wert DESCRIPTION kann man einen optionalen Langtext einfügen, CLASS:PUBLIC zeigt an, dass es sich um einen öffentlichen Termin handelt.

Nun wird es nochmal etwas knifflig. Der Beginn des eigentlichen Termins wird definiert in Zeile 26 mit dem Parameter DTSTART. Hier geben wir unter TZID den Wert an, den wir in Zeile 5 festgelegt haben. Hierdurch wird die passende Zeitzone referenziert. Nach einem Doppelpunkt folgt die Startzeit des Termins im bekannten Format YYYYMMDDTHHMMSS. Somit geben wir die Zeit in der Zeitzone an, die wir mittels TZID definiert haben. Alternativ können wir hier die Zeitzone weglassen und die Zeit in UTC angeben. Dies wird durch ein angehängtes „Z“ angezeigt und würde so aussehen:

DTSTART:20160716T090000Z

In Zeile 27 folgt die Angabe des Terminendes. Hier gilt das Gleiche wie auch beim Terminstart.

Mit dem Parameter DTSTAMP geben wir noch an, zu welchem Zeitpunkt diese ICS-Datei erstellt wurde. Das kann für Synchronisierungs- und Aktualisierungszwecke hilfreich sein.

Die Datei wird mit den schließenden „Tags“ END:VEVENT und END:VCALENDAR beendet.

Ich hoffe, mit diesem Beitrag ein wenig geholfen zu haben. Wer tiefer in die Materie einsteigen möchte, findet auf dieser japanischen Website ausführliche Informationen zum iCal-Format. Zum Experimentieren eignen sich verschiedene Online-Tools, die iCal- bzw. ICS-Dateien über ein Webformular generieren, beispielsweise diese Website.