Mich erreichte vor kurzem eine Leserfrage, in der es darum ging mittels Power Query eine Zeitangabe in UTC (koordinierte Weltzeit), in unsere lokale Zeit umzurechnen. Die Herausforderung hierbei war, die wechselnde Zeitdifferenz von 1 bzw. 2 Stunden zu berücksichtigen, die sich aus der lokalen Sommer- bzw. Winterzeit ergibt.
Als Abonnent meines Newsletters erhältst Du die Beispieldateien zu den Beiträgen dazu. Hier geht’s zum Abonnement des Newsletters!
Anmerkung
Der nachfolgende Beitrag war ursprünglich deutlich länger und detaillierter. Manchmal – Gott sei Dank in diesem Fall zum ersten Mal – kommt es jedoch vor, dass sich ein Leser bei mir meldet und mir mitteilt, dass ich inhaltlichen Unsinn geschrieben habe. In diesem Fall war es der Kollege Frank Tonsen, der sich nicht nur die Zeit nahm, meinen Beitrag zu lesen, sondern auch die notwendige Aufmerksamkeit besaß, meinen Fehler zu entdecken. Mehr noch: Nachdem Frank und ich eine kurze E-Mailkonversation zu diesem Thema hatten, schickte er mir sogar seine Version der Lösung, die ich in leicht angepasster Form hier abdrucke. @Frank: Vielen Dank. Derartige Reaktionen sind es, die ich an dieser Community so mag 🙂
Die Zielstellung
Die Aufgabe bestand darin, Datums- und Uhrzeitangaben, die als koordinierte Weltzeit (UTC – Coordinated Universal Time) von einem Server geliefert wurden, in unsere lokale Zeit umzurechnen. Aufgrund der in Deutschland herrschenden Regelung der Sommer- und Winterzeit kann zur UTC-Zeit jedoch nicht pauschal eine Stunde addiert werden, da die Zeitdifferenz während der Winterzeit 2 Stunden beträgt. Ich möchte die Problemlösung als benutzerdefinierte Funktion zur Verfügung stellen.
Widmen wir uns der Problemlösung.
Problemlösung
Generell kann zur Zeitverschiebung zwischen UTC und unserer Zeit in Deutschland folgendes gesagt werden:
- Unsere Sommerzeit beginnt am letzten Sonntag im März. Um 2 Uhr lokale Zeit (d. h. 1 Uhr UTC), wird die Uhr auf 3 Uhr vorgestellt. Während der Sommerzeit beträgt die Zeitverschiebung daher 2 Stunden
- Unsere Winterzeit beginnt am letzten Sonntag im Oktober. Um 3 Uhr lokale Zeit (d. h. 1 Uhr UTC), wird die Uhr auf 2 Uhr zurückgestellt. Während der Winterzeit beträgt die Zeitverschiebung daher 1 Stunde.
Für das aktuelle Jahr 2019 sieht es also wie folgt aus:
Am 31.03. (letzter Sonntag im März) wurde um 1 Uhr UTC die Zeitverschiebung von 1 Stunde, auf 2 Stunde erhöht. Dadurch folgte auf die lokale Uhrzeit 01:59:59 Uhr nicht 2:00:00 Uhr, sondern 03:00:00 Uhr:
Am 27.10. (letzter Sonntag im Oktober) wurde um 1 Uhr UTC die Zeitverschiebung von 2 Stunden, auf 1 Stund reduziert. Dadurch folgte auf die lokale Uhrzeit 02:59:59 Uhr nicht 3:00:00 Uhr, sondern 02:00:00 Uhr:
Die benutzerdefinierte Funktion, die all das berücksichtigt, sieht wie folgt aus:
Falls Du wissen möchtest, wie Du meine M-Funktionen in Deinen Projekten wiederverwenden kannst, schau bitte hier nach.
Bis zum nächsten Mal und denk dran: Sharing is caring. Wenn Dir der Beitrag gefallen hat, dann teile ihn gerne. Falls Du Anmerkungen hast, schreibe gerne einen Kommentar, oder schicke mir eine Mail an lars@ssbi-blog.de
Viele Grüße aus Hamburg,
Lars
Lars ist Berater, Entwickler und Trainer für Microsoft Power BI. Er ist zertifizierter Power BI-Experte und Microsoft Trainer. Für sein Engagement in der internationalen Community wurde Lars seit 2017 jährlich durch Microsoft der MVP-Award verliehen. Lies hier mehr…
Andre meint
Gibt es auch eine Möglichkeit mit der Funktion die Zeiten in DirectQuery-Modus umzurechnen?
Lars Schreiber meint
Moin Andre,
die Transformationsmöglichkeiten von Power Query sind im DQ-Modus deutlich eingeschränkt (siehe hier: https://docs.microsoft.com/de-de/power-bi/connect-data/desktop-directquery-about#limited-data-transformations), weil die Transformation nicht in Power BI Desktop läuft, sondern durch die Datenquelle ausgeführt werden muss. DQ importiert ja keine Daten, sondern ruft diese bei jeder Berichtsinteraktion live aus der Datenquelle ab. Lange Rede, kurzer Sinn: Ich habe es eben getestet und die Funktion kann in DQ NICHT genutzt werden. Ich würde versuche, diese Konvertierung bereits in einer SQL-View vornehmen zu lassen (hier ein Bsp.: https://stackoverflow.com/questions/8038744/convert-datetime-column-from-utc-to-local-time-in-select-statement) oder ein Custom SQL Statement via Power Query nutzen, um an meine Daten zu kommen.
Danke und LG,
Lars
Weber meint
Hier mal mein Kommentar: Ich finde es echt gut! Danke für den Artikel!
Lars Schreiber meint
Hallo Sascha,
vielen Dank 🙂
Viele Grüße,
Lars