diff --git a/Services/EpgService.cs b/Services/EpgService.cs index 0c844cc..c109841 100644 --- a/Services/EpgService.cs +++ b/Services/EpgService.cs @@ -172,14 +172,7 @@ public class EpgService _eventsByChannel = events; } - /// - /// 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. - /// + /// XMLTV-Zeit "20260510120000 +0200" → DateTime (lokale Zeit) private static DateTime ParseXmltvTime(string s) { if (string.IsNullOrWhiteSpace(s)) return DateTime.MinValue; @@ -188,24 +181,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) { - // 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 + // Offset parsen: "+0200" oder "+0000" 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; } - return dt; + // Kein Offset → UTC annehmen (epg.pw liefert immer +0000, aber sicherheitshalber) + return new DateTimeOffset(dt, TimeSpan.Zero).ToLocalTime().DateTime; } catch { return DateTime.MinValue; } }