Additional findings after deep investigation (confirmed regression)
After further debugging, I can confirm that this is not a database, Docker, or host timezone issue, but a regression in n8n versions ≥ 2.5.x affecting execution timestamps in the UI.
Environment
• n8n Docker (self-hosted)
• PostgreSQL (timestamp with time zone)
• Host timezone: Europe/Moscow (UTC+3)
• Container timezone:
• TZ=Europe/Moscow
• GENERIC_TIMEZONE=Europe/Moscow
• Database timezone:
SHOW timezone*;*
-- Europe/Moscow
Database behavior (verified correct)
PostgreSQL behaves exactly as expected:
SELECT
now() AS now_tz,
now() AT TIME ZONE 'UTC' AS now_utc,
current_setting('TimeZone') AS tz*;*
Result:
• now_tz → local time with +03:00
• now_utc → correctly shifted −3h
• timezone → Europe/Moscow
Execution records are stored correctly:
SELECT
id,
“startedAt”,
“startedAt” AT TIME ZONE ‘UTC’ AS started_utc,
“startedAt” AT TIME ZONE ‘Europe/Moscow’ AS started_msk
FROM execution_entity
ORDER BY id DESC
LIMIT 3*;*
SELECT
id,
“startedAt”,
“startedAt” AT TIME ZONE ‘UTC’ AS started_utc,
“startedAt” AT TIME ZONE ‘Europe/Moscow’ AS started_msk
FROM execution_entity
ORDER BY id DESC
LIMIT 3*;*
Example:
startedAt = 2026-02-09 06:56:43 +03:00
started_utc = 2026-02-09 03:56:43
started_msk = 2026-02-09 06:56:43
Data in the database is correct and consistent.
⸻
Observed behavior
n8n version
Execution start time in UI
2.4.5
Correct (local time)
2.5.x – 2.6.4
Displayed as UTC (−3h offset)
• Execution duration is correct
• Schedule triggers fire at the correct local time
• Only the Executions UI timestamp is wrong
• The UI appears to display startedAt as UTC without converting from the stored timezone
This happens for:
• Webhook triggers
• Manual executions
• Scheduled workflows
⸻
Key conclusion
This is not expected “Executions are always UTC” behavior:
• The database stores timestamp with time zone
• n8n ≤ 2.4.5 rendered execution timestamps correctly
• n8n ≥ 2.5.x consistently renders them as UTC
This strongly indicates a frontend or backend regression in execution timestamp handling introduced after 2.4.5.
⸻
Repro steps (minimal)
1\. Run n8n 2.4.5 → execution times match local timezone
2\. Upgrade to 2.6.x (same DB, same container, same env vars)
3\. Run any workflow
4\. Observe execution start time shown −3h (UTC) in UI
5\. Downgrade back to 2.4.5 → issue disappears
⸻
If this change was intentional, it would be helpful to:
• Clarify it explicitly in documentation as a breaking UI change
• Or provide a setting to render execution timestamps in workflow/system timezone
Happy to provide logs, screenshots, or test data if needed.