diff --git a/Services/EpgService.cs b/Services/EpgService.cs index c109841..0c844cc 100644 --- a/Services/EpgService.cs +++ b/Services/EpgService.cs @@ -172,7 +172,14 @@ public class EpgService _eventsByChannel = events; } - /// XMLTV-Zeit "20260510120000 +0200" → DateTime (lokale Zeit) + /// + /// XMLTV-Zeit "20260510120000 +0200" → lokale DateTime. + /// + /// WICHTIG: epg.pw markiert alle Zeiten mit "+0000", liefert sie aber faktisch + /// schon in lokaler Zeit (MEZ/MESZ). Das ist ein Bug im Feed. Wir behandeln + /// daher "+0000" speziell: Zeit direkt als lokal interpretieren, nicht konvertieren. + /// Echte Offsets (z.B. "+0200") werden korrekt umgerechnet. + /// private static DateTime ParseXmltvTime(string s) { if (string.IsNullOrWhiteSpace(s)) return DateTime.MinValue; @@ -181,24 +188,24 @@ public class EpgService var parts = s.Trim().Split(' ', 2); var dt = DateTime.ParseExact(parts[0], "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture); - // dt.Kind = Unspecified hier if (parts.Length == 2 && parts[1].Length == 5) { - // Offset parsen: "+0200" oder "+0000" + // Sonderfall: epg.pw liefert IMMER "+0000", obwohl die Zeiten in Wahrheit + // schon lokale Sendezeiten sind (Tagesschau 20:00 steht als 200000 +0000, + // nicht 180000 +0000). Daher "+0000" als "bereits lokal" behandeln. + if (parts[1] == "+0000" || parts[1] == "-0000") + return dt; + + // Echter Offset → konvertieren var sign = parts[1][0] == '-' ? -1 : 1; var hh = int.Parse(parts[1].Substring(1, 2)); var mm = int.Parse(parts[1].Substring(3, 2)); var offset = TimeSpan.FromMinutes(sign * (hh * 60 + mm)); - - // dt ist die Uhrzeit im angegebenen Offset (nicht UTC) - // DateTimeOffset(Unspecified, offset) interpretiert dt als "diese Zeit in dieser Zone" - // .ToLocalTime() konvertiert korrekt in die Systemzeitzone return new DateTimeOffset(dt, offset).ToLocalTime().DateTime; } - // Kein Offset → UTC annehmen (epg.pw liefert immer +0000, aber sicherheitshalber) - return new DateTimeOffset(dt, TimeSpan.Zero).ToLocalTime().DateTime; + return dt; } catch { return DateTime.MinValue; } }