Skip to content

Correction du décalage horaire des horaires de planning côté public - #2381

Merged
xavierleune merged 1 commit into
masterfrom
fix/horaires-planning-timezone-affichage
Sep 1, 2026
Merged

Correction du décalage horaire des horaires de planning côté public#2381
xavierleune merged 1 commit into
masterfrom
fix/horaires-planning-timezone-affichage

Conversation

@xavierleune

Copy link
Copy Markdown
Member

Dans la foulée de #2354, la page programme affichait toujours les horaires en UTC en production (exemple : /blog/forumphp2026/program).

Cause

Le filtre date de Twig (et format_datetime) ne se contente pas de formater : il convertit la date vers la timezone par défaut de Twig, c'est-à-dire date_default_timezone_get(), en ignorant la timezone portée par l'objet DateTime. Les horaires de planning étant stockés en timestamp, ils s'affichaient donc en UTC en production, où PHP tourne en UTC — invisible en local, le conteneur de dev étant en Europe/Paris.

Reproduit avec le Twig du projet, PHP en UTC :

entité hydratée : 2026-10-22T09:30:00+02:00
sans timezone   => 07:30      ← page programme en prod
avec timezone   => 09:30

Corriger la timezone à l'hydratation de Planning n'aurait rien changé à l'affichage : Twig la réécrit. Il faut la passer au filtre, comme le fait déjà le back-office depuis #2354.

Correctif

Planning::TIMEZONE est exposée à Twig via un global planning_timezone, utilisé partout où un horaire de planning est affiché :

Fichier Correction
config/packages/twig.yaml global planning_timezone depuis Planning::TIMEZONE
templates/blog/program.html.twig page programme (bug signalé)
templates/blog/talk.html.twig widget talk, même donnée, même bug
templates/event/speaker/page.html.twig format_datetime de l'espace conférencier
templates/event/session/index.html.twig bascule sur le global
Controller/Admin/Event/Session/IndexAction.php variable timezone de rendu devenue redondante
Event/Talk/ExportGenerator.php export CSV joind.in, qui formatait aussi en timezone serveur

Pour l'export, la conversion passe par DateTimeImmutable::createFromInterface() afin de ne pas muter l'entité — même forme que formatForCalendar() dans le back-office.

Vérifications

  • Sémantique du filtre confirmée avant/après sur date et format_datetime, avec le Twig du projet et PHP en UTC.
  • Conversion de l'export vérifiée sur un timestamp hydraté comme le fait Ting (07:3009:30, entité non mutée).
  • Expressions Twig modifiées parsées sans erreur ; php -l sur le fichier PHP modifié.
  • !php/const bien résolu pour les fichiers config/packages (Yaml::PARSE_CONSTANT dans YamlFileLoader::loadFile).

⚠️ Les conteneurs n'étaient pas démarrés côté dev : cs-fixer, PHPStan et Behat n'ont pas été exécutés localement, la CI reste à valider.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LZbMGRyWSL66qwp1551MXd

Le filtre date de Twig ne se contente pas de formater : il convertit la date
vers la timezone par défaut de Twig, c'est-à-dire celle de PHP, en ignorant
celle portée par l'objet DateTime. Les horaires étant stockés en timestamp,
la page programme (et les autres affichages) montraient donc de l'UTC en
production, où PHP tourne en UTC, alors que le conteneur de dev est en
Europe/Paris.

Planning::TIMEZONE est désormais exposée à Twig via le global
planning_timezone, et passée explicitement à chaque affichage d'un horaire
de planning : page programme, widget talk, espace conférencier et back-office
(qui recevait jusqu'ici la constante via une variable de rendu dédiée,
maintenant redondante).

L'export CSV pour joind.in formatait lui aussi les horaires dans la timezone
du serveur : il les convertit désormais dans celle de l'événement.
@xavierleune

Copy link
Copy Markdown
Member Author

les tests qui échouent ne sont pas liés

@xavierleune
xavierleune merged commit 197b65b into master Sep 1, 2026
13 of 14 checks passed
@xavierleune
xavierleune deleted the fix/horaires-planning-timezone-affichage branch September 1, 2026 13:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants