Hallo nochmal zusammen,
ich habe das Problem durch Umwege gelöst und wollte euch über die Erkenntnisse auf dem Laufenden halten.
Auf die richtige Fährte bin ich jedoch erst gekommen, nachdem ich mir sowohl im Browser (Frontend) als auch auf dem Server (Backend) jeweils die aktuelle Zeitzone ausgegeben habe.
In der Entwicklungsumgebung stimmte die Zeitzone (Europe/Berlin) des Frontends mit der Zeitzone (Europe/Berlin) des Backends überein.
Deshalb hat es hier keine Probleme gegeben, da die Umwandlung von 8 Uhr vormittags (Zeitzone Europe/Berlin) in UTC genau das gewünschte Ergebnis 6AM GMT+2 liefert.
In der Test- und Produktivumgebung jedoch, war trotz der exakt gleichen Einstellungen für Region und Zeitzone aber etwas anders.
Zum einen liefen beide Layer (Frontend und Backend) nicht direkt auf dem Server, sondern waren jeweils in einem Docker-Container gekapselt.
Und hier fängt es an, interessant zu werden.
Im Docker-Container sieht es wohl so aus, dass dieser grundsätzlich auf UTC-Zeit vor sich hin wurschtelt. Unabhängig davon, welche Regionaleinstellungen über das darunter liegende Betriebssystem mitgegeben werden.
Gibt man sich in diesem Kontext die Zeitzone des Servers aus, erhält man immer UTC.
Und bei näherer Betrachtung ist dieses Verhalten auch mehr als richtig so.
Um das Problem nun so zu lösen, dass ich nicht auch noch anfangen muss, irgendwelche Regionaltabellen durchzuhecheln, hat folgender Ansatz zum Ziel geführt.
Bei der Übergabe der Daten für den Kalendereintrag aus dem Frontend, hole ich mir die Zeitzone des Systems, mit dem der Benutzer derzeit aktiv arbeitet.
Glücklicherweise hilft mir dabei das in der zuvor gestellten Frage genannte node-Paket "luxon", genau das herauszufinden.
const dtZone = DateTime.local().zoneNameDiese Information übergebe ich mit dem Speicherauftrag aus dem Frontend mit ins Backend (weiterer Inhalt im POST request).
Im Backend ziehe ich diese Information dann aus dem POST-Request heraus.
Beim Berechnen der Zeiten für einen Kalendereintrag, der am ersten Tag beispielweise um 12 Uhr beginnen soll (Feld StartTime), gehe ich nunmehr so vor:
DateTime.fromISO(myISODate).setZone(dtZone).set({ hour: 12 }).toUTC().toISOTime({ includeOffset: false, suppressMilliseconds: true }) }Mit der Methode fromISO übergebe ich das aus dem Frontend übermittelte Datum (im ISO Format). Dabei entsteht ein neues Luxon DateTime-Object.
Im nächsten Schritt setze ich explizit die Zeitzone, die ich aus dem Frontend mitgeteilt habe.
Erst DANACH setze ich die gewünschte Uhrzeit.
Im Anschluss wandle ich das nun vorhanden DateTime-Object in UTC-Notation um, und formatiere schlussendlich die ermittelte Uhrzeit ins vom AppDev-Pack geforderte ISO-Format - ohne Millisekunden
.
Bei einer Kombination von Datum und Zeit (z. B. für das Feld StartDateTime) sieht das dann so aus:
DateTime.fromISO(myISODate).setZone(dtZone).set({ hour: 12 }).toUTC().toISO({ suppressMilliseconds: true }) }Ich habe diesen Ansatz nun an allen Stellen implementiert, in denen Zeitvorgaben gemacht werden. Und mit diesem Ansatz stehen die Kalendereinträge genau so im Kalender, wie sie der Benutzer auch erwartet.
Hoffentlich hilft das dem Einen oder der Anderen hier weiter, damit keine unnötigen Runden beim Entwickeln entstehen.
Lieben Gruß,
Pantelis