Exportación ICS de Calendario/Evento: hora incorrecta (+1 h) al importar en Outlook con TZID=Europe/Berlin

Versión: Discourse 2026.1.5 (ESR), plugin discourse-calendar

Resumen
Los nuevos eventos creados con una zona horaria establecida (timezone="Europe/Berlin" y showLocalTime="true") muestran una hora incorrecta con +1 hora al descargar el archivo .ics e importarlo en Outlook (Windows). La hora es correcta en el propio foro. Solo se ven afectados los nuevos eventos, es decir, la importación mediante el archivo .ics.

Reproducción

  1. Crear un evento (hoy, en horario de verano CEST/UTC+2): 17:00 – 19:15 hora de Berlín.
[event start="2026-08-11 17:00" status="public" name="testevent 2" timezone="Europe/Berlin" showLocalTime="true" end="2026-08-11 19:15"]
[/event]

  1. «Añadir al calendario» → descargar el archivo .ics.
  2. Importar el archivo en Outlook.

Esperado: 11.08.2026, 17:00 – 19:15
Real: 11.08.2026, 18:00 – 20:15 (+1 hora)

Contenido ICS (relevante):

DTSTART;TZID=Europe/Berlin:20260811T170000
DTEND;TZID=Europe/Berlin:20260811T191500

(El archivo no contiene un bloque VTIMEZONE para Europe/Berlin.)

Análisis / Causa sospechada
La exportación especifica la hora localmente con TZID=Europe/Berlin (nombre IANA) en lugar de UTC (...Z). Outlook no entiende los nombres de zonas horarias IANA (utiliza identificadores de Windows como «W. Europe Standard Time») y, sin una definición VTIMEZONE, vuelve al desplazamiento fijo UTC+1 (CET/hora de invierno). Durante la hora de verano (CEST = UTC+2) esto provoca exactamente +1 hora. Comprobación cruzada: importar el mismo archivo en Google Calendar (que entiende las zonas horarias IANA de forma nativa) muestra la correcta 17:00.

Sugerencia: la exportación ICS debería utilizar marcas de tiempo UTC con Z o generar un bloque VTIMEZONE completo que incluya las reglas de horario de verano (véase también la discusión sobre el cumplimiento de la especificación ICS en LOCATION no está disponible en la exportación ICS completa).

Observación adicional: Cuando el mismo evento se crea sin timezone=/showLocalTime, el .ics exportado utiliza UTC y Outlook muestra +2 horas (ya que 17:00 UTC = 19:00 CEST). Este es el comportamiento UTC documentado, pero ilustra aún más que el manejo de las zonas horarias en torno a la exportación ICS resulta confuso para los usuarios que esperan horas locales.

Para comparar, he estado ejecutando mi host de Discourse y el contenedor de la aplicación en la zona horaria IANA local en lugar de UTC debido al comportamiento anterior de las zonas horarias del calendario.

Mi host está configurado con:

timedatectl set-timezone Europe/London

y mi app.yml contiene:

- exec: ln -fs /usr/share/zoneinfo/Europe/London /etc/localtime
- exec: dpkg-reconfigure --frontend noninteractive tzdata

Esto significa que tanto mi host como el contenedor de Discourse utilizan Europe/London, incluido el cambio automático entre GMT y BST.

Podría valer la pena probar lo equivalente con Europe/Berlin en tu instalación para ver si la importación resultante en .ics funciona correctamente en Outlook:

timedatectl set-timezone Europe/Berlin

y, en la sección run:,

- exec: ln -fs /usr/share/zoneinfo/Europe/Berlin /etc/localtime
- exec: dpkg-reconfigure --frontend noninteractive tzdata

Me gustaría saber si eso cambia la importación de tu evento de Berlín a las 17:00, pasando de las 18:00 a las 17:00 esperadas.

Si es así, eso sugeriría que la zona horaria de Discourse/contenedor está influyendo en la exportación; si no es así, la falta de VTIMEZONE o el manejo de Outlook probablemente sea independiente de la zona horaria del servidor.