From 6aa9d8d318d1540caac8becaabfe0ef95ff96b17 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Feb 2026 12:08:03 +0000 Subject: Fix UTC timestamp parsing issue in CtagShuttle causing 60-minute offset Co-authored-by: arielcostas <94913521+arielcostas@users.noreply.github.com> --- Enmarcha.Sources.CtagShuttle/Status.cs | 4 ++-- .../Services/Processors/CtagShuttleRealTimeProcessor.cs | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Enmarcha.Sources.CtagShuttle/Status.cs b/Enmarcha.Sources.CtagShuttle/Status.cs index ecf2da1..f52beaa 100644 --- a/Enmarcha.Sources.CtagShuttle/Status.cs +++ b/Enmarcha.Sources.CtagShuttle/Status.cs @@ -17,10 +17,10 @@ public class CtagShuttleStatus public Status Status => Status.Parse(StatusValue); [JsonIgnore] - public DateTime LastPositionAt => DateTime.Parse(LastPositionAtValue); + public DateTime LastPositionAt => DateTime.Parse(LastPositionAtValue, null, System.Globalization.DateTimeStyles.AssumeUniversal | System.Globalization.DateTimeStyles.AdjustToUniversal); [JsonIgnore] - public DateTime LastOccupancyAt => DateTime.Parse(LastOccupancyAtValue); + public DateTime LastOccupancyAt => DateTime.Parse(LastOccupancyAtValue, null, System.Globalization.DateTimeStyles.AssumeUniversal | System.Globalization.DateTimeStyles.AdjustToUniversal); } public enum Status diff --git a/src/Enmarcha.Backend/Services/Processors/CtagShuttleRealTimeProcessor.cs b/src/Enmarcha.Backend/Services/Processors/CtagShuttleRealTimeProcessor.cs index 593ac86..570059b 100644 --- a/src/Enmarcha.Backend/Services/Processors/CtagShuttleRealTimeProcessor.cs +++ b/src/Enmarcha.Backend/Services/Processors/CtagShuttleRealTimeProcessor.cs @@ -42,7 +42,10 @@ public class CtagShuttleRealTimeProcessor : AbstractRealTimeProcessor System.Diagnostics.Activity.Current?.SetTag("shuttle.status", status.StatusValue); // Validate position timestamp - skip if data is stale (>3 minutes old) - var positionAge = (context.NowLocal - status.LastPositionAt).TotalMinutes; + // Convert UTC timestamp to Madrid time for comparison + var madridTz = TimeZoneInfo.FindSystemTimeZoneById("Europe/Madrid"); + var lastPositionMadrid = TimeZoneInfo.ConvertTimeFromUtc(status.LastPositionAt, madridTz); + var positionAge = (context.NowLocal - lastPositionMadrid).TotalMinutes; if (positionAge > MaxPositionAgeMinutes) { _logger.LogInformation( -- cgit v1.3