Con iCalendar hai la possibilità di unire tutti gli appuntamenti da diversi programmi in un unico posto. Questi possono poi essere gestiti e modificati come file nel formato standard. Dato che si tratta di uno standard globale, quasi tutti gli utenti sono in grado di maneggiare questi file.

Crea il tuo sito web
Scopri le nuovi funzioni IA di MyWebsite
  • Editor facile e intuitivo con supporto IA
  • Immagini e testi d'effetto in pochi secondi
  • Dominio, indirizzo e-mail e certificato SSL inclusi

iCalendar: definizione e spiegazione del formato di scambio dei dati

iCalendar è un formato di scambio di dati del calendario per la condivisione di unità di calendario, definito in RFC 5545. Esso consente di raggruppare gli appuntamenti da diverse applicazioni su PC e smartphone in un unico calendario, da cui gestirli e condividerli. Il formato si basa su vCalendar, creato già nel 1998. Con il formato iCal è dunque possibile gestire e condividere in tempo reale praticamente tutti gli eventi di diverse applicazioni di calendario in un formato chiaro.

Consiglio

Le informazioni contenute in un file iCalendar non sono limitate alle sole date. Il formato consente di organizzare anche liste di cose da fare o riunioni.

Cos’è ical?

A seconda del sistema operativo, i file iCalendar hanno estensioni diverse e non poche persone si chiedono cosa sia ical, ics o iFBF quando ricevono una richiesta. Queste sono semplicemente le estensioni dei file di iCalender: .ics, .ifb, .ical e .ifbf si riferiscono sempre a file in formato iCal, ma presentano alcune differenze.

  • ical: estensione in macOS
  • ics: estensione in tutti gli altri sistemi operativi
  • ifbf: contiene informazioni sulla disponibilità del destinatario della richiesta (in macOS)
  • ifb: contiene informazioni sulla disponibilità del destinatario della richiesta (in tutti gli altri sistemi operativi)

Se desideri inviare la voce di un evento, devi prima selezionare il tipo di file del formato iCalendar per il salvataggio e l’invio. Il formato .ics è spesso la scelta migliore in quanto compatibile con la maggior parte dei sistemi operativi. Quando il destinatario apre il file può decidere se accettare o meno l’invito ricevuto.

Fatto

In linea di principio i file iCalendar sono semplici file di testo che semplificano lo scambio tra sistemi diversi.

I vantaggi di iCalendar

iCalendar non è limitato allo scambio di file. Il formato degli eventi iCalendar è strettamente legato allo standard di posta elettronica, questo significa che adotta la Multipurpose Internet Mail Extension (MIME) e, in particolare, il tipo “text/calendar”. Ciò fa sì che le voci del calendario in questo formato possano essere inserite quasi ovunque e persino integrate nei siti web. Gli eventi possono essere condivisi e le date importanti possono essere pubblicate. Insieme ai server WebDAV, utilizzati per fornire file su internet, è possibile sincronizzare gli eventi in qualsiasi momento.

Questo formato offre, inoltre, la possibilità di condividere gli appuntamenti direttamente tra dispositivi mobili tramite Bluetooth o una rete personale. Pertanto, se ad esempio desideri fissare un incontro di lavoro in una data specifica, non devi fare altro che inviare questo evento a tutti i presenti. iCalendar offre anche la possibilità di utilizzare tutte le informazioni memorizzate in più applicazioni che il formato sincronizza in tempo reale.

Il formato iCalendar è supportato dai programmi di calendario più comuni, che ne integrano i dati basati sul web:

  • Google Calendar
  • Calendario Android
  • Microsoft Outlook
  • Calendario Blackberry
  • Calendario macOS/iOS

Cosa significa la standardizzazione secondo RFC 5545

RFC 5545 stabilisce come le informazioni del calendario devono essere strutturate e codificate, affinché possano essere lette ed elaborate correttamente da diverse applicazioni.

Centrale è la struttura dei dati uniforme basata sulle cosiddette componenti di calendario come VEVENT, VTODO, VJOURNAL o VTIMEZONE. Ognuna di queste componenti segue una struttura chiaramente definita, con campi obbligatori e facoltativi che includono specifiche proprietà come inizio, fine, luogo o descrizione di un appuntamento.

Inoltre, RFC 5545 disciplina anche le seguenti proprietà:

  • la sintassi (formato del testo UTF-8, lunghezza delle righe, interruzioni di riga)
  • Formati di data e ora (incluse le indicazioni del fuso orario)
  • la codifica di eventi ricorrenti, ad esempio tramite la proprietà RRULE.

In questo modo si garantisce che un file .ics creato una volta possa essere interpretato nello stesso modo, indipendentemente dal programma o dal sistema operativo utilizzato.

Sito web con dominio
Crea il tuo sito web personalizzato

MyWebsite Now Starter è lo strumento pensato per i principianti che vogliono creare un sito web in modo intuitivo. Include dominio e indirizzo e-mail.

Come creare un file iCalendar

Dalla teoria alla pratica: segui questi passaggi per creare un evento.

  1. Per prima cosa apri un nuovo documento su un editor di testo a tua scelta. Se disponi della giusta applicazione puoi farlo anche dal tuo smartphone.
  2. Il file viene ora compilato con l’attuale struttura iCalendar, che spiegheremo più dettagliatamente nel prossimo passaggio.
  3. Una volta compilato correttamente, devi esportare il documento nel formato ical. Per farlo devi prima salvare il file con l’estensione “.ics”. 4.Apri ora un programma di calendario a tua scelta e importa il file ics come appuntamento. Tutto quello che devi fare è cliccare sulla voce di menu corrispondente e l’appuntamento sarà caricato automaticamente dalla directory.
  4. L’evento è stato ora inserito come voce nel tuo calendario.

Affinché il trasferimento dei dati avvenga correttamente e il destinatario possa importare l’evento nel proprio calendario ics, devi trasferire le informazioni in un formato predefinito. Ogni riga ha un significato preciso:

Riga iCal Significato
BEGIN:VCALENDAR Inizio di ogni file iCalendar.
VERSION Indica la versione del formato, attualmente “2.0”.
PRODID Riporta il nome o l’indirizzo di chi ha creato il file o dell’applicazione utilizzata.
METHOD Mostra il modo in cui l’evento è trasmesso al destinatario. Esistono due tipi: con l’opzione PUBLISH, l’evento appare immediatamente, mentre con REQUEST l’appuntamento viene trasmesso sotto forma di richiesta.
BEGIN:VEVENT Questa riga corrisponde all’inizio della sezione contenente i dati rilevanti dell’evento.
UID Ogni file ics e quindi ogni voce del calendario deve avere un identificatore univoco.
LOCATION Qui è precisato il luogo dell’evento. Puoi definire liberamente quanto debba essere preciso.
SUMMARY Specifica un breve riassunto dell’evento.
DESCRIPTION In questo punto è fornita una descrizione dettagliata, visualizzata solo all’apertura della voce.
CLASS Qui si specifica se l’evento debba essere salvato come pubblico (PUBLIC) o privato (PRIVATE).
DTSTART Indica l’orario di inizio dell’evento.
DTEND Specifica l’orario di fine dell’evento.
DTSTAMP La marca temporale contiene informazioni sul momento della creazione della voce del calendario.
END:VEVENT La penultima riga chiude la sezione delle informazioni sull’evento.
END:VCALENDAR Fine del file.

Seguono le indicazioni temporali, anch’esse in un formato standardizzato:

  • Le prime quattro cifre indicano l’anno (YYYY): 2019
  • Le prossime due il mese (MM): 201910
  • Le ultime due definiscono il giorno (DD): 20191027
  • La lettera T separa la data dall’ora: 20191027T

L’orario è composto da 6 cifre:

  • due per l’ora: 20191027T15
  • due per i minuti: 20191027T1559
  • due per i secondi: 20191027T155954
  • La lettera Z chiude la sezione relativa alla data: 20191027T155954Z

Nell’esempio seguente abbiamo compilato tutte le righe in base a queste indicazioni.

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:VCALENDAR
txt

Aprendo il file ogni destinatario può ora importare l’evento nel suo calendario e ricevere automaticamente tutte le informazioni rilevanti, dal tipo di evento all’orario di inizio e fine. In questo modo il formato iCalendar garantisce un risparmio di tempo, soprattutto nella vita professionale.

Integrazione di iCalendar nel front end

Invece di creare un file .ics, puoi reindirizzare gli utenti direttamente a un fornitore di calendario online come Google Calendar, Outlook.com o Yahoo Calendar tramite URL specifici. Questi link aprono nel browser del relativo servizio una nuova finestra “Aggiungi evento”, già precompilata con le informazioni su titolo, luogo, descrizione, ora di inizio e di fine.

<a href="https://calendar.google.com/calendar/render?action=TEMPLATE
&amp;text=Release%20Meeting
&amp;details=Status-Update%20%26%20Milestones
&amp;location=Remote%20(Google%20Meet)
&amp;dates=20251010T080000Z/20251010T090000Z
&amp;ctz=Europe/Rome"
target="_blank" rel="noopener">
Aggiungi a Google Calendar
</a>
html

Generare file .ics tramite codice

Di seguito trovi esempi di codice pratici che mostrano come generare file .ics con poche righe di codice. Tutti gli esempi creano un appuntamento “Release-Meeting” il 15.10.2025, 10:00–11:00 Europe/Rome con terminazioni di riga corrette (CRLF) e un escaping semplice.

Esempio con PHP

Nel seguente esempio in PHP viene prima definita la funzione di supporto ics_escape(). Questa funzione assicura che i caratteri speciali come virgole, punti e virgola, backslash o interruzioni di riga vengano correttamente sottoposti a escape. Successivamente, la struttura del file .ics viene definita in un array. Ogni riga rappresenta un attributo specifico della voce di calendario, ad esempio il titolo (SUMMARY), la descrizione (DESCRIPTION) o l’intervallo di tempo (DTSTART, DTEND). implode("\r\n", [...]) unisce le singole righe in un blocco di testo.

Successivamente seguono due comandi header() che informano il browser su come deve essere gestito il file:

  • Content-Type: text/calendar; charset=utf-8 indica che si tratta di un file di calendario nel formato iCalendar.
  • Content-Disposition: attachment; filename="event.ics" indica al browser di non mostrare semplicemente il file nella finestra, bensì di salvarlo automaticamente come download con il nome indicato.

Infine, con echo $ics viene restituito il testo assemblato completo. Non appena lo script PHP (ad esempio event.php) viene aperto nel browser, parte il download del file event.ics, che può poi essere importato subito in Outlook, Google Calendar o Apple Calendar.

function ics_escape($s) {
    return str_replace(
        ["\\",    ";",    ",",    "\n"],
        ["\\\\","\\;", "\\,", "\\n"],
        $s
    );
}
$ics = implode("\r\n", [
    "BEGIN:VCALENDAR",
    "PRODID:-//example.com//ics-php//IT",
    "VERSION:2.0",
    "CALSCALE:GREGORIAN",
    "METHOD:PUBLISH",
    "BEGIN:VEVENT",
    "UID:event-123@example.com",
    "DTSTAMP:20251010T080000Z",
    "DTSTART;TZID=Europe/Rome:20251015T100000",
    "DTEND;TZID=Europe/Rome: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');                // Informa il browser: "Questo è un file .ics"
header('Content-Disposition: attachment; filename="event.ics"'); // Avvia il download
echo $ics; // Invia il testo al browser
php

Esempio con Python

Anche qui, la funzione ics_escape() assicura che caratteri speciali come virgole, punti e virgola o interruzioni di riga vengano correttamente sottoposti a escape. Con datetime.now(timezone.utc) viene creata automaticamente una marca temporale corrente (DTSTAMP) nel formato UTC. Le singole righe dell’evento, come il titolo (SUMMARY), vengono poi unite in un blocco di testo con "\r\n".join([...]). Le interruzioni di riga CRLF (\r\n) restano obbligatorie nel formato ICS.

Infine, il comando Path("event-python.ics").write_text(ics, encoding="utf-8", newline="") scrive il contenuto come file UTF-8 nella directory corrente. Dopo l’esecuzione dello script, il file pronto event-python.ics è disponibile e può essere importato subito in Outlook, Google Calendar o nel calendario di Apple.

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//IT",
    "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/Rome:20251015T100000",
    "DTEND;TZID=Europe/Rome: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("scritto: event-python.ics")
python

Esempio con JavaScript

Il seguente codice JavaScript genera il contenuto del calendario direttamente nel browser. Per prima cosa, il testo iCalendar viene assemblato nella variabile ics. La funzione icsEscape() assicura di nuovo che i caratteri speciali, come le virgole o le interruzioni di riga, vengano correttamente sottoposti a escape. Con Blob() viene creato dal testo un file virtuale in memoria. URL.createObjectURL() genera quindi un URL di download temporaneo, che il browser tratta come un file reale.

Un elemento <a> invisibile con l’attributo download viene generato dinamicamente e attivato automaticamente tramite a.click(): in questo modo parte il download del file event-browser.ics, senza che sia necessaria una connessione al server.

<button id="dl">scarica .ics</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//IT",
    "VERSION:2.0",
    "CALSCALE:GREGORIAN",
    "METHOD:PUBLISH",
    "BEGIN:VEVENT",
    "UID:event-123@example.com",
    "DTSTAMP:20251010T080000Z",
    "DTSTART;TZID=Europe/Rome:20251015T100000",
    "DTEND;TZID=Europe/Rome: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" }); // crea l’oggetto file
    const url = URL.createObjectURL(blob); // URL di download temporaneo
    const a = document.createElement("a");
    a.href = url;
    a.download = "event-browser.ics"; // nome del download
    document.body.appendChild(a);
    a.click(); // avvia il download
    a.remove();
    URL.revokeObjectURL(url); // pulizia
});
</script>
javascript

Esempio con Node.js

Questo codice avvia un piccolo server web express che rende disponibile un file .ics direttamente tramite il browser. Quando qualcuno richiama http://localhost:3000/event.ics, nell’handler app.get(...) viene generato il testo iCalendar e inviato al client.

La funzione icsEscape() fa sì, come negli altri esempi, che i caratteri speciali vengano correttamente sottoposti a escape. Con res.setHeader("Content-Type", "text/calendar; charset=utf-8") il server comunica al browser che si tratta di un file di calendario. L’header Cache-Control: public, max-age=300 consente ai client di memorizzare temporaneamente il file nella cache per 5 minuti.

res.send(ics) invia infine il file pronto direttamente al browser, che lo scarica automaticamente o lo apre con l’app Calendario. Il server poi viene eseguito in locale su 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//IT",
        "VERSION:2.0",
        "CALSCALE:GREGORIAN",
        "METHOD:PUBLISH",
        "BEGIN:VEVENT",
        "UID:event-123@example.com",
        "DTSTAMP:20251010T080000Z",
        "DTSTART;TZID=Europe/Rome:20251015T100000",
        "DTEND;TZID=Europe/Rome: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"); // il browser riconosce il tipo MIME
    res.setHeader("Cache-Control", "public, max-age=300");                    // caching (5 minuti)
    res.send(ics); // invia la risposta
});
app.listen(3000, () => console.log("http://localhost/event.ics"));
javascript

File .ics in diversi client di calendario

Anche se iCalendar è uno standard aperto, ogni applicazione di calendario interpreta i file .ics a modo suo. A seconda del sistema, ci sono differenze nel modo in cui gli appuntamenti vengono importati, sincronizzati e aggiornati.

Google Calendar

In Google Calendar, gli utenti possono importare manualmente i file .ics oppure abbonarsi a un feed del calendario tramite URL.

Durante l’importazione, gli appuntamenti contenuti vengono trasferiti una sola volta nel calendario selezionato. Le modifiche che apporterai in seguito al file sul tuo server non verranno recepite automaticamente. Google tratta quindi questa opzione come un’istantanea.

Funziona in modo leggermente diverso l’abbonamento tramite URL, disponibile solo nella versione web di Google Calendar. Qui selezioni “Altri calendari” -> “Aggiungi tramite URL” e inserisci l’indirizzo internet di un file .ics, per esempio https://example.com/calendar.ics. Google recupera quindi questo file a intervalli regolari, di solito ogni 12-24 ore, e aggiorna automaticamente gli appuntamenti, se qualcosa è cambiato. È importante sapere che Google non accetta link webcal://. Se vuoi offrire sul tuo sito web un link di abbonamento, dovresti invece collegare la versione HTTPS dell’URL.

Calendario di Apple

Il calendario di Apple supporta il formato iCalendar (.ics) in modo particolarmente completo e comodo. Quando gli utenti scaricano un file .ics o lo aprono per e-mail, il sistema lo riconosce automaticamente e chiede in quale calendario importare gli appuntamenti. Anche in questo caso si tratta inizialmente di un’importazione una tantum, che in seguito non viene aggiornata automaticamente.

Molto più potente è però la funzione di abbonamento, che Apple supporta direttamente tramite lo schema webcal://. Se sul tuo sito web offri quindi un link come webcal://example.com/calendar.ics, facendo clic si apre automaticamente la finestra di dialogo del calendario con la domanda se vuoi abbonarti al calendario. Un calendario sottoscritto in questo modo viene poi sincronizzato automaticamente: per impostazione predefinita ogni poche ore. Le modifiche agli appuntamenti esistenti (stessa UID, nuovo DTSTAMP) vengono recepite correttamente, mentre le voci eliminate scompaiono dopo il successivo aggiornamento.

Outlook

Anche Microsoft Outlook può sia importare una sola volta i file .ics sia abbonarsi a essi. Se un file .ics viene aperto con un doppio clic o importato manualmente, Outlook aggiunge semplicemente gli appuntamenti contenuti al calendario selezionato. Questi appuntamenti sono quindi statici: le modifiche successive sul server non hanno effetto.

Durante l’abbonamento, Outlook si comporta in modo simile al calendario di Apple: gli utenti possono inserire l’URL del feed in “Apri calendario” -> “Da Internet” (ad esempio https://example.com/calendar.ics oppure webcal://...). Outlook si abbona a questo calendario e lo sincronizza automaticamente a intervalli regolari. L’intervallo è in genere compreso tra 30 minuti e 3 ore, ma può anche richiedere più tempo.

Outlook.com (cioè la versione web) funziona tecnicamente in modo simile, ma con gli aggiornamenti a volte è ancora più lento dell’app desktop.

Vai al menu principale