Immer wieder stolpere ich über das Thema, das in der Datenquelle ein Zeitstempel als UTC-Zeitstempel vorliegt und wir diese Zeitstempel im Power BI Bericht als lokalen Zeitstempel ausweisen möchten. Eine besondere Herausforderung ist hier die Sommer-/Winterzeit (UTC+2/+1), die datumsabhängig eine Verschiebung des Offsets zur Folge hat.
Doch werfen wir zuerst einen Blick auf die Regelung zur Zeitumstellung in Deutschland (Der mitteleuropäischen Sommerzeit).
Die mitteleuropäische Sommerzeit beginnt am letzten Sonntag im März um 2:00 Uhr MEZ, indem die Stundenzählung um eine Stunde von 2:00 Uhr auf 3:00 Uhr vorgestellt wird.
Wikipedia: https://de.wikipedia.org/wiki/Sommerzeit
Sie endet jeweils am letzten Sonntag im Oktober um 3:00 Uhr MESZ, indem die Stundenzählung um eine Stunde von 3:00 Uhr auf 2:00 Uhr zurückgestellt wird.
Also ermitteln wir zuerst mit Power Query das Umstellungsdatum von Winter- auf Sommerzeit und von Sommer- auf Winterzeit. In diesem Beispiel für das Jahr 2022. Durch die Nutzung der Power Query Funktion Date.StartOfWeek, mit dem letzten Tag des Monats und dem Parameter Day.Sunday, erhalten wir immer den letzten Sonntag des Monats.
Die Zeitverschiebung findet um 2 und 3 Uhr der lokaler Zeit statt, was mit der vorhandenen Zeitverschiebung von 1 und 2 Stunden immer der UTC Zeit von 1 Uhr entspricht. Diese Stunde fügen wir mit der #time Syntax unserem berechneten Daten hinzu.
Mit diesen Angaben können wir nun in Power Query das Offset der Zeitzone für das entsprechende Datum in 2022 bestimmen. Für den Vergleich der Daten müssen wir vom Datentyp DateTimeZone mit der Funktion DateTimeZone.RemoveZone die Zeitzoneninformation entfernen.
Mit der Funktion DateTimeZone.SwitchZone können wir dann das Offset auf den UTC-Zeitstempel anwenden und erhalten somit das Ergebnis in unserer lokalen Zeitzone.
Für eine einfache Wiederverwendung habe ich die oben beschriebenen Schritte in eine benutzerdefinierte Funktion zusammengefasst, die du für diesen Zweck verwenden kannst.
(DateTimeZoneUTC as datetimezone) as datetimezone =>
let
Jahr = Date.Year(DateTimeZoneUTC),
//Bestimmung Start der Sommerzeit
Sommerzeit = Date.StartOfWeek( #date(Jahr, 03, 31), Day.Sunday) & #time(1,0,0),
//Bestimmung Start der Winterzeit
Winterzeit = Date.StartOfWeek( #date(Jahr, 10, 31), Day.Sunday) & #time(1,0,0),
//Berechnung des Offset
Offset = if DateTimeZone.RemoveZone(DateTimeZoneUTC) >= Sommerzeit and DateTimeZone.RemoveZone(DateTimeZoneUTC) < Winterzeit then 2 else 1,
//Änderung der Zeitzoneninformation
DateTimeZoneMEZ = DateTimeZone.SwitchZone(DateTimeZoneUTC,Offset)
in
DateTimeZoneMEZ
Ein Anwendungsbeispiel könnte diese Abfrage sein, die den letzten Aktualisierungszeitpunkt der Abfrage ausgibt. Dieses kann als Anhaltspunkt für die letzte Aktualisierung des DataSets genommen und im Power BI Bericht angezeigt werden. Da die Zeitzone im Power BI Service UTC ist, sollte der Wert für die einfachere Lesbarkeit auf die Zeitzone des Berichtsbetrachters geändert werden. Im Fall dieses Blogartikels die mitteleuropäische Zeitzone.
let
Quelle = Table.FromRows({{DateTimeZoneUTCtoMEZ(DateTimeZone.UtcNow())}},{"Zeitstempel"}),
#"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Zeitstempel", type datetimezone}})
in
#"Geänderter Typ"
Bei der Recherche zu diesem Blogpost habe ich viele ähnliche Beiträge gefunden, von denen ich ein paar hier verlinken möchte.