iCalendar – Das iCal-Format im Überblick
Mit iCalendar hat jeder die Möglichkeit, seine Termine aus unterschiedlichsten Programmen in einem Format zusammenzuführen. Diese können dann im genormten Format als Dateien verwaltet und verändert werden. Da es sich um einen globalen Standard handelt, kann nahezu jede Person mit den Dateien umgehen.
- Modernste Vorlagen, KI-generiert
- Integrierte Marketingtools für Ihren Online-Erfolg
- 24/7 Premium-Support und persönlicher Berater inklusive
iCalendar: Definition und Erklärung des Datenaustauschformats
iCalendar ist ein Kalender-Austauschformat zum Verbreiten von Kalendereinheiten, das in RFC 5545 genormt ist. Damit ist es möglich, Termine aus unterschiedlichen Anwendungen auf PC und Smartphone in einem Kalender zu bündeln, von dort aus zu verwalten und zu teilen. Das Format basiert auf dem bereits 1998 erstellten vCalendar. Mit dem iCal-Format ist es also möglich, ganz praktisch alle Termine aus unterschiedlichen Kalenderfunktionen in einem übersichtlichen Format in Echtzeit zu verwalten und zu teilen.
Die Angaben innerhalb einer iCalendar-Datei beschränken sich nicht ausschließlich auf reine Datumsangaben. Auch To-do-Listen oder Meetings lassen sich mit dem Format organisieren.
Was ist iCal?
Je nach Betriebssystem haben die iCalendar-Dateien eine andere Abkürzung und nicht wenige Menschen fragen sich bei einer Anfrage, was ical, ics oder iFBF ist? Es handelt sich dabei immer um Dateiendungen von iCalendar: .ics, .ifb, .ical und .ifbf bezeichnen zwar immer Dateien im iCal-Format, haben aber gewisse Unterschiede.
- ical: Namenserweiterung für macOS
- ics: Dateinamenserweiterung für alle anderen Betriebssysteme
- ifbf: Enthält Informationen, ob man frei oder beschäftigt ist (für macOS)
- ifb: Enthält Informationen, ob man frei oder beschäftigt ist (alle anderen Betriebssysteme)
Wenn Sie einen Termineintrag versenden wollen, müssen Sie zum Speichern und Versenden den Dateityp des iCalendar-Formats auswählen. Eine .ics-Datei zu erstellen, ist oft die beste Wahl, da der .ics-Datei-Aufbau bzw. das Format mit den meisten Betriebssystemen kompatibel ist. Öffnet die empfangende Person die Datei, kann sie danach selbst entscheiden, ob sie den erhaltenen Termin annimmt oder nicht.
Bei iCalendar-Dateien handelt es sich prinzipiell um einfache Textdateien, was den Austausch unter unterschiedlichen Systemen erleichtert.
Die Vorteile von iCalendar
iCalendar ist nicht auf den Austausch von Dateien beschränkt. Das Format hinter den iCalendar-Terminen ist eng mit dem E-Mail-Standard verbunden; es folgt darum der Multipurpose Internet Mail Extension (MIME) und speziell dem Typ „text/calendar“. Dank dieser offenen Gestaltung lassen sich Kalendereinträge in diesem Format nahezu überall platzieren und so sogar auf Webseiten einbinden. Veranstaltungen lassen sich damit teilen oder wichtige Termine veröffentlichen. Zusammen mit WebDAV-Servern, die zur Bereitstellung von Dateien über das Internet verwendet werden, können Termine jederzeit abgeglichen werden.
Weiterhin bietet das Format die Option, dass Termine direkt über Bluetooth oder ein persönliches Netzwerk zwischen mobilen Endgeräten ausgetauscht werden können. Sollte man also bei einem Geschäftsmeeting den nächsten Termin festlegen wollen, kann man diesen Eintrag einfach an alle Anwesenden übermitteln. Zudem bietet iCalendar die Möglichkeit, alle gespeicherten Informationen in mehreren Anwendungen zu nutzen, die durch das Format in Echtzeit synchronisiert werden.
Das iCalendar-Format wird von den gängigen Kalenderprogrammen akzeptiert, die die webbasierten Daten aus dem Kalender einbinden:
- Google Kalender
- Android Kalender
- Microsoft Outlook
- Blackberry Kalender
- macOS/iOS Kalender
Was bedeutet die Normierung durch RFC 5545
RFC 5545 legt fest, wie Kalenderinformationen strukturiert und codiert werden müssen, damit sie von unterschiedlichen Anwendungen korrekt gelesen und verarbeitet werden können.
Zentral ist dabei die einheitliche Datenstruktur auf Basis sogenannter Kalenderkomponenten wie VEVENT, VTODO, VJOURNAL oder VTIMEZONE. Jede dieser Komponenten folgt einem klar definierten Aufbau mit Pflicht- und optionalen Feldern, die bestimmte Eigenschaften wie Beginn, Ende, Ort oder Beschreibung eines Termins enthalten.
Darüber hinaus regelt RFC 5545 auch folgende Eigenschaften:
- die Syntax (UTF-8-Textformat, Zeilenlänge, Zeilenumbrüche)
- Datums- und Zeitformate (inklusive Zeitzonenangaben)
- die Kodierung wiederkehrender Ereignisse, z. B. durch die
RRULE-Eigenschaft.
Dadurch wird sichergestellt, dass eine einmal erstellte .ics-Datei unabhängig vom verwendeten Programm oder Betriebssystem gleich interpretiert werden kann.
iCal erstellen: So funktioniert‘s
Von der Theorie in die Praxis. Einen Termin zu erstellen, funktioniert wie folgt:
- Zunächst öffnen Sie ein neues Dokument in einem Texteditor Ihrer Wahl. Mit der richtigen App geht das auch auf einem Smartphone.
- Die Datei wird nun mit dem gängigen iCalendar-Schema befüllt, das wir Ihnen im nächsten Schritt genauer erläutern.
- Nach dem korrekten Ausfüllen des Dokuments folgt der Export im iCal-Format. Dazu muss die Datei mit dem Kürzel „.ics“ gespeichert werden.
- Öffnen Sie ein Kalenderprogramm Ihrer Wahl und importieren Sie die .ics-Datei als Termin. Dazu reicht ein Klick auf den entsprechenden Menüpunkt, und schon wird der Termin automatisch aus dem Verzeichnis hochgeladen.
- Der Termin findet sich nun als Eintrag in Ihrem Kalender.
Damit die Weitergabe von Daten richtig funktioniert und der Empfänger bzw. die Empfängerin den Termin in den eigenen Kalender importieren kann, müssen Sie die Informationen in einem vorgegebenen Format übermitteln. Dabei hat jede Zeile eine entsprechende Bedeutung:
| iCal-Zeile | Bedeutung | |
|---|---|---|
BEGIN:VCALENDAR
|
Damit wird jede iCalendar-Datei eröffnet. | |
VERSION
|
Angegeben wird hier die Version des Formats, aktuell „2.0“. | |
PRODID
|
Hier wird der Name oder die Adresse der erstellenden Person bzw. der verwendeten Anwendung eingetragen. | |
METHOD
|
Zeigt die Übermittlungsart an: Mit PUBLISH erscheint ein Eintrag sofort, während man den Termin mit REQUEST in eine Anfrage verpackt
|
|
BEGIN:VEVENT
|
Diese Zeile markiert den Beginn des Bereichs, der die relevanten Daten des Termins enthält. | |
UID
|
Jede .ics-Datei und damit jeder Kalendereintrag benötigt einen unverwechselbaren Unique Identifier. | |
LOCATION
|
An dieser Stelle nennt man den Veranstaltungsort, wobei man selbst entscheiden kann, wie genau. | |
SUMMARY
|
Der Eintrag vermittelt eine kurze Zusammenfassung zum Termin. | |
DESCRIPTION
|
An dieser Stelle erfolgt eine ausführliche Beschreibung, die nur zu sehen ist, wenn der Termineintrag geöffnet wird. | |
CLASS
|
Hier entscheidet sich, ob der Termin öffentlich (PUBLIC) oder privat (PRIVATE) gespeichert werden soll.
|
|
DTSTART
|
Gibt den Startzeitpunkt des Termins an. | |
DTEND
|
Gibt an, bis wann der Termin eingeplant ist. | |
DTSTAMP
|
Der Zeitstempel enthält die Information, wann der Kalendereintrag erstellt wurde. | |
END:VEVENT
|
Die vorletzte Zeile beendet den Bereich mit Termininformationen. | |
END:VCALENDAR
|
Schließt die Datei ab. |
Auch die Zeitangaben folgen einem normierten Format:
- Die ersten vier Ziffern entsprechen dem Jahr (YYYY): 2019
- Die nächsten zwei dem Monat (MM): 201910
- Die letzten beiden definieren den Tag (DD): 20191027
- Mit dem Buchstaben T trennen Sie Datum von Uhrzeit ab: 20191027T
Die Uhrzeit wiederum besteht aus 6 Zahlen:
- zwei für die Stunde: 20191027T15
- zwei für die Minute: 20191027T1559
- zwei für die Sekunde: 20191027T155954
- Mit einem Z wird die Datumseingabe geschlossen: 20191027T155954Z
Im folgenden Beispiel sind alle Zeilen entsprechend ausgefüllt.
BEGIN:VCALENDAR
VERSION:2.0
PRODID:Cal_App//Daily@Planet
METHOD:PUBLISH
BEGIN:VEVENT
UID:123456789@example.com
LOCATION:Metropolis
SUMMARY:Meeting
DESCRIPTION:Kick-off Meeting
CLASS:PUBLIC
DTSTART:20191101T100000Z
DTEND: 20191101T120000Z
DTSTAMP: 20191027T155954Z
END:VEVENT
END:VCALENDARtxtJede Empfängerin und jeder Empfänger des Termins kann nun mit dem Öffnen der Datei den Termin in seinen Kalender eintragen lassen und erhält so alle relevanten Informationen, von der Art des Termins bis hin zu Start- und Endzeitpunkt, ganz automatisch. Damit sorgt das iCalendar-Format vor allem im Berufsleben für eine echte Zeitersparnis.
iCalendar ins Frontend einbinden
Anstatt eine .ics-Datei zu erstellen, können Sie Nutzerinnen und Nutzer über spezielle URLs direkt zu einem Online-Kalender-Anbieter wie Google Kalender, Outlook.com oder Yahoo Kalender weiterleiten. Diese Links öffnen ein neues „Event hinzufügen“-Fenster im Browser des jeweiligen Dienstes, schon vorausgefüllt mit den Infos zu Titel, Ort, Beschreibung, Start-/Endzeit.
<a href="https://calendar.google.com/calendar/render?action=TEMPLATE
&text=Release%20Meeting
&details=Status-Update%20%26%20Milestones
&location=Remote%20(Google%20Meet)
&dates=20251010T080000Z/20251010T090000Z
&ctz=Europe/Berlin"
target="_blank" rel="noopener">
In Google Kalender eintragen
</a>html.ics-Dateien per Code generieren
Im Folgenden finden Sie praxisnahe Codebeispiele, die zeigen, wie sich .ics-Dateien mit wenigen Zeilen Code erzeugen lassen. Alle Beispiele erzeugen einen Termin „Release-Meeting“ am 15.10.2025, 10:00–11:00 Europe/Berlin mit korrekten Zeilenenden (CRLF) und einfachem Escaping.
PHP-Beispiel
Im folgenden PHP-Beispiel wird zuerst die Hilfsfunktion (ics_escape) definiert. Diese Funktion sorgt dafür, dass Sonderzeichen wie Kommas, Semikolons, Backslashes oder Zeilenumbrüche richtig „maskiert“ werden. Anschließend wird der Aufbau der .ics-Datei in einem Array definiert. Jede Zeile steht dabei für ein bestimmtes Attribut des Kalendereintrags, etwa den Titel SUMMARY, die Beschreibung DESCRIPTION oder den Zeitraum DTSTART, DTEND.
implode("\r\n", [...]) fügt die einzelnen Zeilen zu einem Textblock zusammen.
Danach folgen zwei header()-Befehle, die den Browser darüber informieren, wie die Datei behandelt werden soll:
Content-Type: text/calendar; charset=utf-8gibt an, dass es sich um eine Kalenderdatei im iCalendar-Format handelt.Content-Disposition: attachment; filename="event.ics"weist den Browser an, die Datei nicht einfach im Fenster anzuzeigen, sondern automatisch als Download mit dem angegebenen Namen zu speichern.
Zum Schluss wird mit echo $ics der fertig zusammengesetzte Text ausgegeben. Sobald das PHP-Skript (z. B. event.php) im Browser aufgerufen wird, startet der Download der Datei event.ics – diese kann dann sofort in Outlook, Google Calendar oder Apple Calendar importiert werden.
function ics_escape($s) {
return str_replace(
["\\", ";", ",", "\n"],
["\\\\","\\;", "\\,", "\\n"],
$s
);
}
$ics = implode("\r\n", [
"BEGIN:VCALENDAR",
"PRODID:-//example.com//ics-php//DE",
"VERSION:2.0",
"CALSCALE:GREGORIAN",
"METHOD:PUBLISH",
"BEGIN:VEVENT",
"UID:event-123@example.com",
"DTSTAMP:20251010T080000Z",
"DTSTART;TZID=Europe/Berlin:20251015T100000",
"DTEND;TZID=Europe/Berlin:20251015T110000",
"SUMMARY:" . ics_escape("Release-Meeting"),
"DESCRIPTION:" . ics_escape("Status-Update & Milestones"),
"LOCATION:" . ics_escape("Remote (Google Meet)),
"END:VEVENT",
"END:VCALENDAR",
""
]);
header('Content-Type: text/calendar; charset=utf-8); // Teilt dem Browser mit: „Das ist eine .ics-Datei“
header('Content-Disposition: attachment; filename="event.ics"'); // Löst Download aus
echo $ics; // Sendet den Text an den BrowserphpPython-Beispiel
Auch hier stellt die Funktion ics_escape() sicher, dass Sonderzeichen wie Kommas, Semikolons oder Zeilenumbrüche korrekt maskiert werden. Mit datetime.now(timezone.utc) wird automatisch ein aktueller Zeitstempel (DTSTAMP) im UTC-Format erstellt. Die einzelnen Zeilen des Termins wie Titel (SUMMARY), werden anschließend mit "\r\n".join([...]) zu einem Textblock verbunden. Die CRLF-Zeilenumbrüche (\r\n) sind weiterhin Pflicht im ICS-Format.
Der Befehl Path("event-python.ics").write_text(ics, encoding="utf-8", newline="") schreibt den Inhalt schließlich als UTF-8-Datei ins aktuelle Verzeichnis. Nach dem Ausführen des Skripts liegt die fertige Datei event-python.ics bereit und kann sofort in Outlook, Google Calendar oder Apple Calendar importiert werden.
from datetime import datetime, timezone
from pathlib import Path
def ics_escape(s: str) -> str:
return s.replace("\\", "\\\\").replace(";", "\\;").replace(",", "\\,").replace("\n", "\\n")
ics = "\r\n".join([
"BEGIN:VCALENDAR",
"PRODID:-//example.com//ics-python//DE",
"VERSION:2.0",
"CALSCALE:GREGORIAN",
"METHOD:PUBLISH",
"BEGIN:VEVENT",
"UID:event-123@example.com",
f"DTSTAMP:{datetime.now(timezone.utc):%Y%m%dT%H%M%SZ}",
"DTSTART;TZID=Europe/Berlin:20251015T100000",
"DTEND;TZID=Europe/Berlin:20251015T110000",
f"SUMMARY:{ics_escape('Release-Meeting)}",
f"DESCRIPTION:{ics_escape('Status-Update & Milestones)}",
f"LOCATION:{ics_escape('Remote (Google Meet))}",
"END:VEVENT",
"END:VCALENDAR",
""
])
Path("event-python.ics").write_text(ics, encoding="utf-8", newline="")
print("geschrieben: event-python.ics")pythonJavaScript-Beispiel
Der nachfolgende JavaScript-Code erzeugt den Kalenderinhalt direkt im Browser. Zuerst wird der iCalendar-Text in der Variablen ics zusammengestellt. Die Funktion icsEscape() sorgt erneut dafür, dass Sonderzeichen wie Kommas oder Zeilenumbrüche korrekt maskiert werden. Mit Blob() wird aus dem Text eine virtuelle Datei im Speicher erstellt. URL.createObjectURL() erzeugt daraus eine temporäre Download-URL, die der Browser wie eine echte Datei behandelt.
Ein unsichtbares <a>-Element mit dem Attribut download wird dynamisch erzeugt und durch a.click() automatisch ausgelöst – so startet der Download der Datei event-browser.ics, ohne dass eine Serververbindung nötig ist.
<button id="dl">.ics herunterladen</button>
<script>
function icsEscape(s){return s.replace(/\\/g,"\\\\").replace(/;/g,"\\;").replace(/,/g,"\\,").replace(/\n/g,"\\n");}
const ics = [
"BEGIN:VCALENDAR",
"PRODID:-//example.com//ics-browser//DE",
"VERSION:2.0",
"CALSCALE:GREGORIAN",
"METHOD:PUBLISH",
"BEGIN:VEVENT",
"UID:event-123@example.com",
"DTSTAMP:20251010T080000Z",
"DTSTART;TZID=Europe/Berlin:20251015T100000",
"DTEND;TZID=Europe/Berlin:20251015T110000",
"SUMMARY:" + icsEscape("Release-Meeting"),
"DESCRIPTION:" + icsEscape("Status-Update & Milestones"),
"LOCATION:" + icsEscape("Remote (Google Meet)),
"END:VEVENT",
"END:VCALENDAR",
""
].join("\r\n");
document.getElementById("dl").addEventListener("click", () => {
const blob = new Blob([ics], { type: "text/calendar;charset=utf-8" }); // Dateiobjekt erzeugen
const url = URL.createObjectURL(blob); // Temporäre Download-URL
const a = document.createElement("a");
a.href = url;
a.download = "event-browser.ics"; // Downloadname
document.body.appendChild(a);
a.click(); // Startet Download
a.remove();
URL.revokeObjectURL(url); // Aufräumen
});
</script>javascriptNode.js-Beispiel
Dieser Code startet einen kleinen Express-Webserver, der eine .ics-Datei direkt über den Browser bereitstellt. Wenn jemand http://localhost:3000/event.ics aufruft, wird im app.get(...)-Handler der iCalendar-Text erzeugt und an den Client gesendet.
Die Funktion icsEscape() sorgt wie in den anderen Beispielen dafür, dass Sonderzeichen korrekt maskiert werden. Mit res.setHeader("Content-Type", "text/calendar; charset=utf-8") teilt der Server dem Browser mit, dass es sich um eine Kalenderdatei handelt. Der Header Cache-Control: public, max-age=300 erlaubt es Clients, die Datei für 5 Minuten zwischenzuspeichern.
res.send(ics) sendet schließlich die fertige Datei direkt an den Browser, der sie automatisch herunterlädt oder mit der Kalender-App öffnet. Der Server läuft anschließend lokal unter http://localhost:3000/event.ics.
import express from "express";
const app = express();
function icsEscape(s){
return s.replace(/\\/g,"\\\\").replace(/;/g,"\\;").replace(/,/g,"\\,").replace(/\n/g,"\\n");
}
app.get("/event.ics", (req, res) => {
const ics = [
"BEGIN:VCALENDAR",
"PRODID:-//example.com//ics-node//DE",
"VERSION:2.0",
"CALSCALE:GREGORIAN",
"METHOD:PUBLISH",
"BEGIN:VEVENT",
"UID:event-123@example.com",
"DTSTAMP:20251010T080000Z",
"DTSTART;TZID=Europe/Berlin:20251015T100000",
"DTEND;TZID=Europe/Berlin:20251015T110000",
"SUMMARY:" + icsEscape("Release-Meeting"),
"DESCRIPTION:" + icsEscape("Status-Update & Milestones"),
"LOCATION:" + icsEscape("Remote (Google Meet)),
"END:VEVENT",
"END:VCALENDAR",
""
].join("\r\n");
res.setHeader("Content-Type", "text/calendar; charset=utf-8"); // Browser erkennt MIME-Typ
res.setHeader("Cache-Control", "public, max-age=300"); // Caching (5 Minuten)
res.send(ics); // Antwort senden
});
app.listen(3000, () => console.log("http://localhost/event.ics"));javascript.ics-Dateien in unterschiedlichen Kalender-Clients
Auch wenn iCalendar ein offener Standard ist, interpretiert jede Kalenderanwendung .ics-Dateien auf ihre eigene Weise. Je nach System gibt es Unterschiede darin, wie Termine importiert, synchronisiert und aktualisiert werden.
Google Kalender
In Google Kalender können Nutzerinnen und Nutzer .ics-Dateien entweder manuell importieren oder einen Kalender-Feed per URL abonnieren.
Beim Import werden die enthaltenen Termine einmalig in den gewählten Kalender übernommen. Änderungen, die Sie später an der Datei auf Ihrem Server vornehmen, werden nicht automatisch übernommen. Google behandelt diese Variante also wie eine Momentaufnahme.
Etwas anders funktioniert das Abonnement per URL, das nur in der Webversion von Google Kalender verfügbar ist. Hier wählt man „Weitere Kalender“ -> „Per URL hinzufügen“ und gibt die Internetadresse einer .ics-Datei ein, zum Beispiel https://example.com/calendar.ics. Google ruft diese Datei dann regelmäßig, meist alle 12 bis 24 Stunden, ab und aktualisiert die Termine automatisch, sofern sich etwas geändert hat. Wichtig ist dabei, dass Google keine webcal://-Links akzeptiert. Wenn Sie auf Ihrer Website einen Abo-Link anbieten möchten, sollten Sie also stattdessen die HTTPS-Version der URL verlinken.
Apple Kalender
Apple Kalender unterstützt das iCalendar-Format (.ics) besonders umfassend und komfortabel. Wenn Nutzer und Nutzerinnen eine .ics-Datei herunterladen oder per Mail öffnen, erkennt das System sie automatisch und fragt, in welchen Kalender die Termine importiert werden sollen. Auch hier handelt es sich zunächst um einen Einmal-Import, der später nicht automatisch aktualisiert wird.
Viel mächtiger ist allerdings die Abo-Funktion, die Apple über das Schema webcal:// direkt unterstützt. Wenn Sie auf Ihrer Website also einen Link wie webcal://example.com/calendar.ics anbieten, öffnet sich bei einem Klick darauf automatisch der Kalender-Dialog mit der Frage, ob der Kalender abonniert werden soll. Ein solcher abonnierter Kalender wird anschließend automatisch synchronisiert – standardmäßig alle paar Stunden. Änderungen an bestehenden Terminen (gleiche UID, neuer DTSTAMP) werden korrekt übernommen, gelöschte Einträge verschwinden nach der nächsten Aktualisierung.
Outlook
Auch Microsoft Outlook kann .ics-Dateien sowohl einmalig importieren als auch abonnieren. Wird eine .ics-Datei per Doppelklick geöffnet oder manuell importiert, fügt Outlook die enthaltenen Termine einfach dem gewählten Kalender hinzu. Diese Termine sind dann statisch – spätere Änderungen auf dem Server wirken sich nicht aus.
Beim Abonnement verhält sich Outlook ähnlich wie Apple Kalender: Nutzerinnen und Nutzer können unter „Kalender öffnen“ -> „Aus dem Internet“ die URL des Feeds eingeben (etwa https://example.com/calendar.ics oder auch webcal://...). Outlook abonniert diesen Kalender und synchronisiert ihn automatisch in regelmäßigen Abständen. Das Intervall liegt meist zwischen 30 Minuten und 3 Stunden, kann aber auch länger dauern.
Outlook.com (also die Webversion) funktioniert technisch ähnlich, ist aber bei Aktualisierungen teilweise noch langsamer als die Desktop-App.

