Suche

ISO-8601 Zeitformat in Power Automate & Power Apps

Themen

Datum- und Zeitfunktionen in Power Automate

Zeit- und Datumswerte sind in IT-Systemen selten so gespeichert, wie wir sie im Alltag sehen. Statt „12:30:15“ begegnen einem oft kryptische Formate wie PT12H30M15S. Das ist kein Zufall, sondern Teil des internationalen ISO-8601-Standards, der festlegt, wie Zeitangaben maschinenlesbar dargestellt werden.

Der Code PT12H30M15S beschreibt eine Dauer von 12 Stunden, 30 Minuten und 15 Sekunden. Das P steht für „Period“, das T leitet den Zeitanteil ein. Danach folgen H für Stunden, M für Minuten und S für Sekunden. Dieses Format ist extrem präzise, aber für Benutzeroberflächen oder Berichte eher unpraktisch.

Wenn solche Werte aus Datenbanken, APIs oder externen Systemen kommen, müssen sie in ein verständliches Format wie HH:mm:ss umgewandelt werden. Das ermöglicht nicht nur eine bessere Lesbarkeit, sondern oft auch eine direkte Weiterverarbeitung, etwa für Filter, Berechnungen oder Zeitdifferenzen.

Die Herausforderung: ISO-8601-Dauerangaben lassen sich nicht einfach mit Standard-Datumsfunktionen formatieren, weil sie keinen festen Bezug zu einem Datum haben. Stattdessen muss man die Werte aus dem String extrahieren, umwandeln und neu zusammensetzen.

Im nächsten Schritt schauen wir uns in zwei separaten Artikeln an, wie genau diese Umwandlung in Power Automate und Power Apps funktioniert – jeweils mit fertigen Funktionen, die sofort eingesetzt werden können.

Power Automate: ISO-8601 Zeitformat

Wenn du in einem Flow einen Zeitwert aus einer Datenbank, einer API oder besonders aus SQL holst, kann es dir passieren, dass du statt einer klaren Uhrzeit (12:30:15) plötzlich so etwas wie PT12H30M15S bekommst. Das ist das ISO-8601-Format für eine Dauer – maschinenfreundlich, aber nicht wirklich nutzerfreundlich.

Standardfunktionen wie formatDateTime() bringen hier nichts, weil sie nur mit vollständigen Datumsangaben arbeiten. Deshalb müssen wir den String auseinandernehmen, die einzelnen Teile extrahieren und wieder zu einer Uhrzeit zusammensetzen.

Dafür kannst du in Power Automate diesen Ausdruck verwenden:

outputs('Compose') = "PT12H30M15S"

Power Automate
concat(
    formatNumber(
        int(
            if(
                contains(outputs('Compose'), 'H'),
                substring(
                    outputs('Compose'),
                    add(indexOf(outputs('Compose'), 'PT'), 2),
                    sub(indexOf(outputs('Compose'), 'H'), add(indexOf(outputs('Compose'), 'PT'), 2))
                ),
                '0'
            )
        ),
        '00'
    ),
    ':',
    formatNumber(
        int(
            if(
                contains(outputs('Compose'), 'M'),
                if(
                    contains(outputs('Compose'), 'H'),
                    substring(
                        outputs('Compose'),
                        add(indexOf(outputs('Compose'), 'H'), 1),
                        sub(indexOf(outputs('Compose'), 'M'), add(indexOf(outputs('Compose'), 'H'), 1))
                    ),
                    substring(
                        outputs('Compose'),
                        add(indexOf(outputs('Compose'), 'PT'), 2),
                        sub(indexOf(outputs('Compose'), 'M'), add(indexOf(outputs('Compose'), 'PT'), 2))
                    )
                ),
                '0'
            )
        ),
        '00'
    ),
    ':',
    formatNumber(
        int(
            if(
                contains(outputs('Compose'), 'S'),
                if(
                    contains(outputs('Compose'), 'M'),
                    substring(
                        outputs('Compose'),
                        add(indexOf(outputs('Compose'), 'M'), 1),
                        sub(indexOf(outputs('Compose'), 'S'), add(indexOf(outputs('Compose'), 'M'), 1))
                    ),
                    if(
                        contains(outputs('Compose'), 'H'),
                        substring(
                            outputs('Compose'),
                            add(indexOf(outputs('Compose'), 'H'), 1),
                            sub(indexOf(outputs('Compose'), 'S'), add(indexOf(outputs('Compose'), 'H'), 1))
                        ),
                        substring(
                            outputs('Compose'),
                            add(indexOf(outputs('Compose'), 'PT'), 2),
                            sub(indexOf(outputs('Compose'), 'S'), add(indexOf(outputs('Compose'), 'PT'), 2))
                        )
                    )
                ),
                '0'
            )
        ),
        '00'
    )
)

Der Ausdruck zerlegt den ISO-8601-Zeitstring (PT12H30M15S) in Stunden, Minuten und Sekunden. Mit substring() und indexOf() werden die Zahlenwerte zwischen H, M und S ausgelesen. if() sorgt dafür, dass fehlende Teile (z. B. keine Minuten) automatisch als 0 gesetzt werden. int() wandelt die Strings in Zahlen, formatNumber() formatiert sie zweistellig (00). Am Ende fügt concat() alles zu HH:mm:ss zusammen.

Power Apps: ISO-8601 Zeitformat

Auch in Power Apps kann es dir passieren, dass du Zeitangaben im ISO-8601-Dauerformat (PT12H30M15S) bekommst. Das passiert oft, wenn Daten aus SQL, einer API oder einem Flow in deine App geladen werden. Das Format ist technisch korrekt, aber für den Nutzer völlig unlesbar.

Die gute Nachricht: Mit etwas String-Parsing lässt sich daraus eine saubere Uhrzeit im Format HH:mm:ss machen – und zwar komplett in Power Apps, ohne externe Konvertierung.

Dazu kannst du folgenden Code verwenden:

Power Apps
With(
    {timeString: "PT12H30M10S"},
    With(
        {
            hPos: Find(
                "H",
                timeString
            ),
            mPos: Find(
                "M",
                timeString
            ),
            sPos: Find(
                "S",
                timeString
            ),
            tPos: Find(
                "T",
                timeString
            )
        },
        With(
            {
                hours: If(
                    hPos > 0,
                    Value(
                        Mid(
                            timeString,
                            tPos + 1,
                            hPos - tPos - 1
                        )
                    ),
                    0
                ),
                minutes: If(
                    mPos > 0,
                    Value(
                        Mid(
                            timeString,
                            If(
                                hPos > 0,
                                hPos + 1,
                                tPos + 1
                            ),
                            mPos - If(
                                hPos > 0,
                                hPos + 1,
                                tPos + 1
                            )
                        )
                    ),
                    0
                ),
                seconds: If(
                    sPos > 0,
                    Value(
                        Mid(
                            timeString,
                            If(
                                mPos > 0,
                                mPos + 1,
                                If(
                                    hPos > 0,
                                    hPos + 1,
                                    tPos + 1
                                )
                            ),
                            sPos - If(
                                mPos > 0,
                                mPos + 1,
                                If(
                                    hPos > 0,
                                    hPos + 1,
                                    tPos + 1
                                )
                            )
                        )
                    ),
                    0
                )
            },
            Text(
                Time(
                    hours,
                    minutes,
                    seconds
                ),
                "hh:mm:ss"
            )
        )
    )
)

Zuerst sucht Find() die Positionen der Buchstaben H, M, S und T im String, um zu wissen, wo Stunden, Minuten und Sekunden beginnen und enden. Mit Mid() wird anschließend der Teilstring zwischen diesen Markern herausgeschnitten. If() stellt sicher, dass fehlende Angaben – etwa wenn keine Sekunden vorhanden sind – automatisch als 0 gesetzt werden. Danach wandelt Value() die Textwerte in echte Zahlen um, und Time() baut daraus einen gültigen Uhrzeitwert. Zum Schluss sorgt Text() dafür, dass das Ergebnis sauber im Format HH:mm:ss angezeigt wird.

Das Ergebnis: Aus PT12H30M15S wird zuverlässig 12:30:15, und es funktioniert auch, wenn nur Stunden und Minuten oder nur Sekunden im String stehen.

Das ISO-8601-Zeitformat mag auf den ersten Blick kompliziert wirken, ist aber technisch ein klarer und einheitlicher Standard. Das Problem liegt meist nicht im Format selbst, sondern darin, dass es für den Anwender nicht intuitiv lesbar ist. Mit den richtigen Funktionen lassen sich Werte wie PT12H30M15S jedoch problemlos in eine nutzerfreundliche Uhrzeit wie 12:30:15 umwandeln – egal, ob in Power Automate oder Power Apps. Der Schlüssel liegt im Zerlegen des Strings, dem Extrahieren der Stunden-, Minuten- und Sekundenwerte und dem anschließenden Formatieren. So bleibt die technische Präzision erhalten, während die Darstellung für den Nutzer verständlich und direkt nutzbar wird.

noch mehr interessante Beiträge

Nach oben scrollen