UTC Zeit konvertieren

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

UTC Zeit konvertieren

Beitrag von msfox (Specialist / 374 / 57 / 76 ) »
Ich bin im fremden Quellcode auf folgendes gestoßen

Code: Alles auswählen.

    CONVERT DATE sy-datlo
        TIME sy-timlo
        INTO TIME STAMP l_timestampl
        TIME ZONE 'UTC'.
Damit ist der Timestamp = aktuelle Uhrzeit. Aber UTC bedeutet ja Winterzeit - 1h.
Ich habe das Ergebnis nun "blind" verwendet und ging davon aus, dass es wirklich UTC ist, da es ja angegeben ist. Nur wenn die SAP im CONVERT etwas umwandelt, woher weiß sie, was die Quellzeitzone ist? Hier findet doch nicht wirklich eine Konvertierung statt. Wenn ich statt UTC CET verwendet, habe ich die aktuelle Uhrzeit + 1h. Wäre auch wieder nicht richtig.
Was müsste man angeben, damit hier nicht UTC suggeriert wird?

Code: Alles auswählen.

    GET TIME STAMP FIELD l_timestampl.
Liefert auch in UTC, so auch in der Hilfe zum Befehl.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: UTC Zeit konvertieren

Beitrag von PeterPaletti (Specialist / 350 / 32 / 97 ) »
Die F1-Hilfe zu dem Befehl sagt : "Diese Anweisung konvertiert ein in dat angegebenes Datum, eine in tim angegebene Zeit und eine in dst angegebene Sommerzeitmarkierung der in tz angegebenen Zeitzone in einen Zeitstempel und weist das Ergebnis der Variablen time_stamp zu. "
Ich verstehe das so, dass der Zusatz TIME ZONE 'UTC' die Zeitzone der Quellzeit meint. Der Zeitstempel ist immer in UTC-Zeit. Der Zusatz TIME ZONE 'UTC' ist eigentlich überflüssig, weil ja von UTC nach UTC gar nichts konvertiert zu werden braucht.
Ich habe spaßeshalber mal TIME ZONE 'WDFT' (Walldorf Zeit) eingegeben und man erhält deutsche Winterzeit -1h

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
msfox


Re: UTC Zeit konvertieren

Beitrag von msfox (Specialist / 374 / 57 / 76 ) »
PeterPaletti hat geschrieben:
13.02.2023 11:52
dass der Zusatz TIME ZONE 'UTC' die Zeitzone der Quellzeit
Nur warum muss dann "TIME ZONE 'UTC'" nach "INTO TIME STAMP" stehen. Damit würde es für mir zur Zielzeit gehören.
--
Weiterhin ist ja sy-timlo auch nicht UTC, da hier die aktuelle Uhrzeit drauf steht.

Re: UTC Zeit konvertieren

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
DATE, TIME, TIMEZONE und DAYLIGHT SAVING TIME sind die lokalen Zeitangaben aus denen der TIMESTAMP gebildet wird. Ein TIMESTAMP selbst ist immer UTC.

Wenn man bei einer Zeitkonvertierung als TIMEZONE 'UTC' angibt werden DATE und TIME als Angaben aus der Zeitzone 'UTC' interprediert und somit ist zwischen dem Zeitstempel und Datum/Zeit kein Unterschied (außer einer allfälligen Sommerzeitabweichung) erkennbar.
Verwendet man hingegen z.B. 'CET' ist eine Abweichung von 1 Sunde (bzw. 2 Stunden im Sommer) erkennbar.
Der Zusatz DAYLIGHT SAVING TIME ist nur für die Edge-Cases an den Tagen bzw. Stunden der Zeitumstellung relevant, also ob bei der lokalen Zeitangabe bereits die DST-Abweichung berücksichtigt wurde oder nicht.

Möchte man nun aus einem TIMESTMP wieder die lokalen Zeitinformationen haben, gibt man mit TIMEZONE an, in welche Zeitzone umgewandelt werden soll. An den Tagen der Zeitumstellung kann man in diesem Fall mit dem Zusatz DAYLIGHT SAVING TIME bestimmen ob die Zeitumstellung in den lokalen Zeitinformationen berücksichtigt werden soll oder nicht.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
msfox

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: UTC Zeit konvertieren

Beitrag von msfox (Specialist / 374 / 57 / 76 ) »
a-dead-trousers hat geschrieben:
13.02.2023 15:23
Wenn man bei einer Zeitkonvertierung als TIMEZONE 'UTC' angibt werden DATE und TIME als Angaben aus der Zeitzone 'UTC' interprediert und somit ist zwischen dem Zeitstempel und Datum/Zeit kein Unterschied (außer einer allfälligen Sommerzeitabweichung) erkennbar.
Also habe ich bei

Code: Alles auswählen.

CONVERT DATE sy-datlo
        TIME sy-timlo
        INTO TIME STAMP l_timestampl
        TIME ZONE 'UTC'.
keinen Unterschied in der Zeit.
Und nun kommt die Fangfrage :-).
Ich habe mir in der DB die aktuell Uhrzeit (also aus sy-timlo) als Timestamp gemerkt.
Die SAP speichert nun ihre Änderungsbelege (CDHDR) für den Geschäftspartner wirklich in UTC - als -1h zur aktuellen Zeit. Dem Fuba CHANGEDOCUMENTS_READ kann ich nun Datum von Uhrzeit von mitgeben, ab wann ich die Änderunsgbelege haben will. Konkret für das Änderungsbelegobjekt des Geschäftspartners muss die Uhrzeit aus "meinem" Timestamp der Datenbank -1h (UTC) gebildet werden.
(Die Ablage der Daten in der DB ist in beiden Fällen nicht veränderbar!).
Wie mache ich die Umwandlung nun am Besten.
- einfach -1h bei dem Timestamp rechnen?
- oder:

Code: Alles auswählen.

    CONVERT TIME STAMP l_timestampl TIME ZONE 'UTC-1'
            INTO DATE DATA(lv_udate) TIME DATA(lv_utime).
Beides klappt auf alle Fälle jetzt, aber funktioniert das auch noch mit Sommerzeit?

Re: UTC Zeit konvertieren

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
Nimm 'CET', dann klappt es auch mit der Sommerzeit.
'CET' hat im Customizing für die Zeitzonen die Sommerzeitregel hinterlegt. Bei 'UTC-1' bin ich mir da nicht so sicher.
Mit 'sy-zonlo' hast du übrigens Zugriff auf die aktuelle Zeitzone der Session. Damit die Abfrage auch aus nicht "mitteleuropäischen" Gegenden klappt.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
msfox

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: UTC Zeit konvertieren

Beitrag von msfox (Specialist / 374 / 57 / 76 ) »
a-dead-trousers hat geschrieben:
13.02.2023 18:39
Nimm 'CET', dann klappt es auch mit der Sommerzeit.
Das klappt aber nicht. Wenn ich die aktuell Uhrzeit (also meinen Timestamp aus der genannten Tabelle) in CET konvertiere, habe ich +1h.

Code: Alles auswählen.

DATA: l_timestampl TYPE timestampl.
    CONVERT DATE sy-datlo
        TIME sy-timlo
        INTO TIME STAMP l_timestampl
        TIME ZONE 'UTC'.

    CONVERT TIME STAMP l_timestampl TIME ZONE 'CET' "'UTC-1'
            INTO DATE DATA(lv_udate) TIME DATA(lv_utime). "+1h.

Re: UTC Zeit konvertieren

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
Beim Umwandeln in den TIMESTAMP (das erste Convert) musst du auch CET nehmen.
Im Grunde wandelst du mit diesem Befehlt das lokale Datum/Uhrzeit in deiner Zeitzone in einen Zeitstempel der immer die Basis UTC hat.
Um daraus wieder das lokale Datum/Uhrzeit zu ermitteln musst du angeben in welche Zeitzone umgewandelt werden soll.

Wenn du jetzt in deiner Tabelle die Daten (zur Sommerzeit) mit UTC abgelegt hast, hast du ein Minus von zwei, welches du beim Import mit UTC-1 (in der Winterzeit) kompensieren kannst. Das Problem ist wie gesagt, dass UTC keine Sommer/Winterzeit hat. Das heißt wenn du deine Zeitstempel falsch erstellt hast (als UTC) wirst du sie nur in der zum Erstellzeitpunkt gültigen Zeitrechnung als UTC korrekt auslesen können.

Wenn du da jetzt kein großes Durcheinander haben willst, würde ich dir vorschlagen die falsch abgelegten Zeitstempel mit einem Korrekturreport zu korrigieren:
Als UTC einlesen, dann die Sommer bzw. Winterzeit korrigieren und neu als CET wieder zurückwandeln.
Zuletzt geändert von a-dead-trousers am 14.02.2023 18:08, insgesamt 1-mal geändert.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: UTC Zeit konvertieren

Beitrag von msfox (Specialist / 374 / 57 / 76 ) »
a-dead-trousers hat geschrieben:
14.02.2023 17:53
Beim Umwandeln in den TIMESTAMP (das erste Convert) musst du auch CET nehmen.
Das war nur das Beispiel. In Wirklichkeit liegt der erste TIMESTAMP so auf der Datenbank. Das ist nicht änderbar, da ich nur die Daten verwende, aber selbst nicht Erzeuger bin.

Re: UTC Zeit konvertieren

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
msfox hat geschrieben:
14.02.2023 18:02
Das war nur das Beispiel. In Wirklichkeit liegt der erste TIMESTAMP so auf der Datenbank. Das ist nicht änderbar, da ich nur die Daten verwende, aber selbst nicht Erzeuger bin.
Dann wird der Zeitstempel entweder falsch gebildet oder es ist gar kein echter TIMESTAMP (auch wenn vielleicht die Domäne verwendet wird).
In manchen Programmen habe ich schon gesehen, dass einfach Datum und Uhrzeit concatenated werden und das dann als "Zeitstempel" bezeichnet wird.

EDIT:
Oder der Zeitstempel ist doch richtig und stammt aber aus einer anderen Zeitzone. Dann stimmt die Umwandlung nach CET wieder.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: UTC Zeit konvertieren

Beitrag von msfox (Specialist / 374 / 57 / 76 ) »
a-dead-trousers hat geschrieben:
14.02.2023 18:11
Dann wird der Zeitstempel entweder falsch gebildet [...]dass einfach Datum und Uhrzeit concatenated werden
Das macht in diesem Fall das CONVERT. D.h. obwohl dort UTC steht, ist meiner Meinung nach CET, da die aktuelle Uhrzeit im Zeitstempel steht.
Somit muss ich quasi CET nach UTC umwandeln.

Re: UTC Zeit konvertieren

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
Im Zeitstempel muss UTC stehen, also aus Sicht CET -1 Stunde bzw. -2 Stunden im Sommer. Wenn nicht, dann wurde er falsch erzeugt.
In diesem Fall würde ich dir raten, wenn du das Erzeugen nicht beeinflussen kannst, dass du mit Split bzw. Concatenate arbeitest.
Wenn du Datum und Uhrzeit haben möchtest, den Zeitstempel einem Charfeld zuordnen, dann sind die ersten 8 Zeichen das Datum und die hinteren 6 Zeichen die Uhrzeit.
Wenn du einen Zeitstempel für die Abfrage bilden möchtest, kannst du CONVERT mit UTC verwenden.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: UTC Zeit konvertieren

Beitrag von msfox (Specialist / 374 / 57 / 76 ) »
Ich habe es jetzt wie folgt gelöst

Code: Alles auswählen.

CONVERT TIME STAMP l_timestampl TIME ZONE 'UTC'
            INTO DATE DATA(lv_udate) TIME DATA(lv_utime).

    cl_abap_tstmp=>systemtstmp_syst2utc(
      EXPORTING
        syst_date = lv_udate
        syst_time = lv_utime
      IMPORTING
        utc_tstmp = l_utc_tstmp ).

    CONVERT TIME STAMP l_utc_tstmp TIME ZONE 'UTC'
            INTO DATE lv_udate TIME lv_utime.
Der Timestamp der eigentlich CET war, wird zunächst in Datum und Uhrzeit gesplittet. Dann hat die SAP eine Methode, um daraus einen wirklichen UTC-Time-Stamp zu machen. Danach wieder in Datum und Uhrzeit splitten.

Seite 1 von 1

Vergleichbare Themen

2
Antw.
4399
Views
Datum und Zeit konvertieren
von mastert1 » 28.07.2008 09:50 • Verfasst in ABAP® für Anfänger
3
Antw.
10691
Views
Zeit/Datum je Werk in tatsächliche Zeit umrechnen!
von hsiebert » 27.08.2007 11:23 • Verfasst in ABAP® für Anfänger
9
Antw.
4114
Views
zeit messung
von kostonstyle » 18.09.2008 11:13 • Verfasst in ABAP® für Anfänger
1
Antw.
1369
Views
HR: Zeit-Infotyp Berechtigung
von Manfred K. » 31.03.2017 13:49 • Verfasst in ABAP® für Anfänger
8
Antw.
9544
Views
Read Table mit MAX Datum und Zeit
von autohandel7 » 23.08.2018 10:54 • Verfasst in ABAP® für Anfänger

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

SD_PRINT_TERMS_OF_PAYMENT
vor einer Woche von Manfred K. 1 / 1938
BUSOBJEKT zu CMIS PHIO ermitteln
vor 4 Wochen von snooga87 1 / 3762