Título, lugar, fecha y hora, zona horaria, repetición, invitados, avisos y notas; después descarga el archivo .ics o ábrelo directamente en tu calendario. También puedes pegar un horario o adjuntar un documento o una foto para crear varios eventos a la vez.

¿Por qué mi evento de calendario aparece una hora, o un día, desfasado?

Un archivo .ics puede expresar una hora de tres maneras, y casi siempre la causa es haber usado la incorrecta. Una hora flotante (DTSTART:20260815T090000, sin zona) son las nueve en punto donde sea que se abra. Una hora UTC (con una Z al final) es un instante absoluto. Una zona con nombre (DTSTART;TZID=Europe/London:...) es un instante que mantiene la misma hora local del reloj a través del horario de verano. Una importación desfasada una hora suele deberse a un nombre de zona al estilo de Windows, como «GMT Standard Time», que el calendario que lo lee no reconoce y por lo cual recurre a UTC; un evento de todo el día desfasado un día suele deberse a una marca de tiempo de medianoche donde se necesitaba VALUE=DATE, o a una fecha de fin escrita en el último día en lugar del día siguiente, ya que DTEND es exclusivo. ICS Maker escribe una hora flotante de forma predeterminada y un TZID que nombra una zona IANA cuando se elige una, sin incluir un bloque VTIMEZONE, que todos los calendarios habituales resuelven a partir del propio nombre de la zona.

Las tres formas en que un archivo puede indicar cuándo

Flotante: sin zona alguna
DTSTART:20260815T090000. Las nueve de la mañana donde sea que se abra. Es correcto para una cita local, un recordatorio o cualquier cosa definida por el propio reloj de quien lo lee; deja de serlo en el momento en que dos personas en países distintos necesitan reunirse.
UTC: un instante absoluto
DTSTART:20260815T090000Z, con la Z al final. Un único momento en el tiempo, convertido a hora local por lo que sea que lo abra. Inequívoco, pero pierde el hecho de que la reunión era «las diez en Londres», así que un cambio de horario de verano la desplaza.
Zona con nombre: un instante que sobrevive al horario de verano
DTSTART;TZID=Europe/London:20260815T090000. Lo que necesita una reunión recurrente: la serie permanece a las diez en punto en hora local aunque el desfase cambie por debajo. La RFC 5545 exige un bloque VTIMEZONE correspondiente que defina los desfases de esa zona junto a ella.

Este creador escribe la primera de forma predeterminada y la tercera cuando eliges una zona de la lista. Ese valor predeterminado es deliberado: una cita con el dentista a las nueve debe ser a las nueve, y adjuntar la zona de la máquina que generó el archivo es la forma en que un evento termina apareciendo una hora desfasado para quien lo lee.

Escribe el TZID sin incluir un bloque VTIMEZONE, algo que vale la pena saber antes de enviar el archivo a algún sitio poco habitual. Apple Calendar, Google Calendar, Outlook y Thunderbird incorporan todos la base de datos de zonas horarias de IANA y resuelven Europe/London solo a partir del nombre, así que el bloque supondría varios cientos de líneas repitiendo lo que quien lo lee ya sabe. Un analizador estricto que solo resuelve las zonas definidas en el propio archivo es el caso en el que esa concesión no compensa: pega un bloque VTIMEZONE a mano si es a eso a lo que estás alimentando.

Leer un archivo que llegó mal

Ábrelo en un editor de texto y observa la línea DTSTART, porque la respuesta siempre está ahí. Una Z al final con un desfase que no esperabas significa que quien lo envió convirtió a UTC desde una zona que no compartes. Un TZID que nombra algo como GMT Standard Time en lugar de Europe/London es la forma en que lo escribe Microsoft Exchange, y los calendarios que solo conocen los nombres de IANA pueden recurrir a UTC, que es la clásica importación desfasada una hora. Un TZID que nombra una zona que no es ni un nombre de IANA ni está definida por un bloque VTIMEZONE en el mismo archivo es el caso en el que cada lector adivina de forma distinta, y adivina UTC con la frecuencia suficiente como para que sea lo segundo que hay que comprobar.

El evento de todo el día que se desplaza un día

Un evento de todo el día es una fecha, no una hora: DTSTART;VALUE=DATE:20260815. Escrito como una marca de tiempo de medianoche en su lugar, se convierte en un instante real, y cualquier conversión hacia el oeste lo arrastra al día anterior. La fecha de fin es la otra mitad de la trampa: es exclusiva, así que un solo día el 15 termina el 16, y un archivo que lo termina el 15 no muestra nada en algunos calendarios.

Preguntas

¿Por qué mi evento de calendario aparece desfasado una hora?
Casi siempre por un desajuste de horario de verano: el archivo indica un desfase UTC fijo, o un nombre de zona al estilo de Windows que el calendario que lo lee no reconoce, y quien lo lee recurre a UTC. Comprueba la línea DTSTART: si termina en Z, la hora es UTC absoluta, y si lleva un TZID, esa zona debe estar escrita como un nombre IANA, como Europe/Paris, o de lo contrario debe estar definida por un bloque VTIMEZONE en el mismo archivo. Los calendarios habituales resuelven el nombre IANA a partir de su propia copia de la base de datos de zonas horarias y no necesitan tal bloque.
¿Debo establecer una zona horaria o dejarla sin indicar?
Déjala sin indicar cuando el evento esté definido por la hora local del reloj: una cita, un recordatorio, una clase que empieza a las nueve dondequiera que estés. Establece una cuando el evento ocurra en un único instante que los invitados de otras zonas deban convertir, como una llamada, un seminario web o una transmisión.
¿Qué es una hora flotante?
Una fecha y hora escrita sin zona y sin una Z al final, que la RFC 5545 establece que debe interpretarse como hora local dondequiera que se lea. Es la opción correcta con más frecuencia de lo que se espera, y la incorrecta siempre que dos lectores en zonas distintas deban ponerse de acuerdo sobre un momento.
¿Por qué mi evento de todo el día aparece en el día equivocado?
Porque se escribió como una marca de tiempo a medianoche en lugar de como un valor de fecha. Un verdadero evento de todo el día usa VALUE=DATE sin ninguna hora, así que no hay nada que convertir. Recuerda también que la fecha de fin es exclusiva: un evento de un día el 15 tiene DTEND el 16.