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.
Großartiger Artikel, hat mir sehr weitergeholfen, danke!
Oh klasse, mal kein Spam-Kommentar! Vielen Dank und gern geschehen! ;)
perfekt! Danke! Ist für mich jetzt einfacher, das in VB zu programmieren. Da ich bis jetzt kein Tool gefunden habe, wo ich „mal eben schnell“ eine ics erstellen kann, bau ich das selber.
Vielen dank für deine Mühe, sehr hilfreich!
PS: Ich habe trotz AfD Anhänger ‚CET‘ benutzt ??
Danke für das Lob! Dass AfD-Anhänger durchaus kreativ sind bei der Auswahl ihrer Aufreger-Themen war mir bekannt, aber dass auch die Physik nicht den nationalen Vorstellungen entspricht, erfüllt mich dann doch mit einer gewissen Belustigung… :D
Danke für diesen Artikel. Hat mir sehr weitergeholfen. Doch eine Frage hätte ich noch: Kann ich auch steuern in welchen Kalender ich den Termin eintrgen möchte? Ich habe einen privaten und einen geschäftlichen Kalender.
Moin Uwe!
Ich bin ziemlich sicher, dass das geht – ich habe nur gerade die Spezifikation nicht auf Anhieb gefunden. Allerdings gebe ich zu Bedenken, dass der Name des Kalenders nicht standardisiert ist. Somit hast Du einen privaten Kalender, der ggf. „privat“ heißt und einen geschäftlichen mit Namen „geschäftlich“. Wenn nun in der ICS-Datei steht, dass der Termin im Kalender „private“ (englische Schreibweise, e am Ende) eingetragen werden soll, passiert folgendes: Du bekommst einen neuen Kalender namens „private“ und hast dann drei Kalender. So ist es mir mal mit einem importierten Termin gegangen, daher bin ich auch so sicher, dass das geht. Ich rate aus o.g. Gründen allerdings stark davon ab. Beim Importieren des Termins wird man – je nach Anwendungssoftware – ohnehin gefragt, in welchen Kalender man das eintragen möchte.
Viele Grüße!
Vielen, vielen Dank für diesen Artikel – er hat mir sehr weitergeholfen! :)
Freut mich, vielen Dank!!
Danke sehr! Hat mir sehr geholfen. Jetzt hab ich noch das Problem, dass die Umlaute falsch dargestellt werden. Gibt es dafür eine Lösung?
Meine ICS-Dateien erstelle ich mit dem Texteditor von Windows…
Hi Markus,
freut mich, dass Dir der Artikel geholfen hat!
Aus der Ferne ist das mit den Umlauten schwer zu beurteilen. Ich vermute aber mal stark, dass es mit der Kodierung der Datei zu tun hat. Besorg‘ Dir am besten mal einen „richtigen“ Text-Editor, bei dem Du die Kodierung einstellen kannst. Z.B. den hier: https://notepad-plus-plus.org/download/v7.7.1.html. Wenn Du da im Menu „Kodierung“ den Punkt „Konvertiere zu UTF-8“ wählst, sollte es eigentlich klappen.
Grüße
Hallo,
wow vielen Dank für diese ausführliche Erklärung – das hat auch mir sehr geholfen.
Zu meinem Glück fehlt nur noch ein Feature: Alle Teilnehmer sollen antworten können (und die Antwort an den Organizer versendet werden).
Gibt es hier einen teilnehmerunabhängigen Befehl?
Vielen Dank und beste Grüße
Renate
Hallo Renate!
Ich freue mich sehr über Dein Lob!
Meines Wissens ist das ICS-Format nur zum Austausch von Termininformationen gedacht. Das Beantworten von Anfragen ist Sache der Groupware bzw. des Clients (z.B. Outlook/Exchange). Aber evtl. hat ja ein anderen Leser eine Idee dazu?
Viele Grüße,
Bernd
Hallo,
Das Netz ist in diesem Bereich voll von abenteuerlichen Tipps und Tricks.
Aber dieser Artikel hilft wirklich weiter.
Vielen Dank!
Beste Grüße,
Christian
Oh, vielen Dank! =)
Hey,
vielen Dank!!
Ich kann meine ICS Datei öffnen und diese auch in den Kalender.
Leider kann ich die Datei nun nicht in meinen Google Konto importieren….
Moin,
gibt es denn auch die Möglichkeit Benachrichtigungszeit (und Tag) voreinzustellen?
Und auch die Farbe des Kalendereintrages?
Ich erstelle einen Kalender über ein externes Programm, in dem Termine mit dem gleichen Inhalt enthalten sind (immer Ganztagestermine):
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Marcus//Needed Found dates//default//EN
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200919
DTEND;VALUE=DATE:20200920
UID:2020-09-19Marcus
CREATED:20200915T1324thZ
SUMMARY:Kurzbeschreibung
DESCRIPTION:langer text
X-MICROSOFT-CDO-BUSYSTATUS:FREE
TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200920
DTEND;VALUE=DATE:20200921
UID:2020-09-20Marcus
CREATED:20200915T1324thZ
SUMMARY:Kurzbeschreibung
DESCRIPTION:langer text )
X-MICROSOFT-CDO-BUSYSTATUS:FREE
TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200929
DTEND;VALUE=DATE:20200930
UID:2020-09-29Marcus
CREATED:20200915T1324thZ
SUMMARY:Kurzbeschreibung
DESCRIPTION:langer text )
X-MICROSOFT-CDO-BUSYSTATUS:FREE
TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200930
DTEND;VALUE=DATE:20201001
UID:2020-09-30Marcus
CREATED:20200915T1324thZ
SUMMARY:Kurzbeschreibung
DESCRIPTION:langer text
X-MICROSOFT-CDO-BUSYSTATUS:FREE
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR
Vielleicht gibt es dazu eine Idee?
Vielen Dank
Marcus
p.s. der Link zu pratie.com ist nicht mehr aktuell
Habe lange nach einer Lösung für Sommer-/Winterzeit gesucht.
Deine Lösung funktioniert und ist super beschrieben – vielen Dank dafür
Vielen vielen Dank für diese ausführliche Beschreibung. Die Erklärung der Zeitzone hat mein Problem mit Outlook gelöst. Outlook und Windows Mail hat im Sommer immer falsche Zeiten angezeigt. Wohingegen alle anderen Systeme die richtig Uhrzeit für Beginn und Ende übernommen haben.
Hallo Bernd,
vielen Dank für die ausführliche Anleitung! Da sit viel Wissen in wenigen verständlichen Zeilen dargelegt.
Ich hätte noch eine weitere Idee zu einem Anwedungsfall, vllt fällt dir was ein:
Ich würde gerne einzelne Räume, die über eine eigene Mailadresse verfügen per QR Code buchen lassen.
Sprich jmd scannt den Code an der Tür und der entsprechende Raum ist dann für die nächsten 60min gebucht.
Hier muss Start- und Endzeit ja dynamisch abhängig von der aktuellen Uhrzeit gewählt werden.
Gibt es da entsprechende Codevariablen?
VG
Phil
Sehr gute Erklärung, vielen Dank.
Ich hätte da aber eine Frage zum Attribut „Anzeigen als“
Wie kann ich in der ical Datei angeben, das der Termin dort als „Frei“, „Mit Vorbehalt“, „Gebucht“ angelegt wird.
Manche Termine sind einfach nur Platzhalter bzw. Erinnerungen.
Moin,
ganz herzlichen Dank für deine tolle Erklärung von ics-Dateien! Ich bin total begeistert! Ich war in eine „Falle“ hineingetappt: ics-Dateien für ganzjährige Terminserien und für Einzeltermine in der Winterzeit (erzeugt und für die Winterzeit) zeigten richtige Ergebnisse…. nur als ich jetzt in der Winterzeit die ics-Datei für einen Einzeltermin in der Sommerzeit erzeugte, stimmte die Uhrzeit nicht mehr. Dank deiner Erklärung geht es jetzt.
Herzliche Grüße
Frank-R.
Hallo,
bin Laie…
Wie kann ich denn aus einem schon bestehenden Kalender im iPhone eine ics-Datei machen? Ist das überhaupt möglich oder geht es nur über eine neue TXT-Datei?
Danke für Infos.