Reapply "EPG: epg.pw liefert lokale Zeit mit falschem +0000 - speziell behandeln"
This reverts commit 3804bb989d.
This commit is contained in:
parent
3804bb989d
commit
ed7a237e33
1 changed files with 16 additions and 9 deletions
|
|
@ -172,7 +172,14 @@ public class EpgService
|
||||||
_eventsByChannel = events;
|
_eventsByChannel = events;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>XMLTV-Zeit "20260510120000 +0200" → DateTime (lokale Zeit)</summary>
|
/// <summary>
|
||||||
|
/// 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.
|
||||||
|
/// </summary>
|
||||||
private static DateTime ParseXmltvTime(string s)
|
private static DateTime ParseXmltvTime(string s)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(s)) return DateTime.MinValue;
|
if (string.IsNullOrWhiteSpace(s)) return DateTime.MinValue;
|
||||||
|
|
@ -181,24 +188,24 @@ public class EpgService
|
||||||
var parts = s.Trim().Split(' ', 2);
|
var parts = s.Trim().Split(' ', 2);
|
||||||
var dt = DateTime.ParseExact(parts[0], "yyyyMMddHHmmss",
|
var dt = DateTime.ParseExact(parts[0], "yyyyMMddHHmmss",
|
||||||
System.Globalization.CultureInfo.InvariantCulture);
|
System.Globalization.CultureInfo.InvariantCulture);
|
||||||
// dt.Kind = Unspecified hier
|
|
||||||
|
|
||||||
if (parts.Length == 2 && parts[1].Length == 5)
|
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 sign = parts[1][0] == '-' ? -1 : 1;
|
||||||
var hh = int.Parse(parts[1].Substring(1, 2));
|
var hh = int.Parse(parts[1].Substring(1, 2));
|
||||||
var mm = int.Parse(parts[1].Substring(3, 2));
|
var mm = int.Parse(parts[1].Substring(3, 2));
|
||||||
var offset = TimeSpan.FromMinutes(sign * (hh * 60 + mm));
|
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 new DateTimeOffset(dt, offset).ToLocalTime().DateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kein Offset → UTC annehmen (epg.pw liefert immer +0000, aber sicherheitshalber)
|
return dt;
|
||||||
return new DateTimeOffset(dt, TimeSpan.Zero).ToLocalTime().DateTime;
|
|
||||||
}
|
}
|
||||||
catch { return DateTime.MinValue; }
|
catch { return DateTime.MinValue; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue