Getrenntes Datum und Zeit addieren
Author: matthiasforberg
Publication Date: 4/21/2015 9:24
Hallo,
ich habe ein bis zwei Fragen bzgl. Datumsberechnungen.
Bislang gab es im Projekt die Standard-Datumseingabe über CMS_INPUT_DATE mit mode="datetime", also Eingabe von Datum und Uhrzeit zusammen. Jetzt wollten die Redakteure aber eine Trennung haben, damit die Uhrzeit immer auf einen Standardwert vorbelegt werden kann und nur im Bedarfsfall geändert wird. Also haben wir jetzt zwei DATE Komponenten, eine mit mode="date", die andere mit mode="time".
Da glücklicherweise für beide Varianten das jeweils fehlende Datum mit 0 gespeichert wird, habe ich mir gedacht, ich kann Datum und Uhrzeit einfach addieren und bekomme wieder das komplette Datum, so wie vorher.
Folgende Konstellation habe ich jetzt:
altes Datum:
- stDateTime (mode="datetime")
neues Datum:
- stDate (mode="date")
- stTime (mode="time")
Meine Addition sieht so aus:
$CMS_SET(setDateTimeNew, stDate.plus(stTime.milliseconds))$
Im Ergebnis bekomme ich immer eine Stunde weniger als bei stDateTime.
Soweit so gut, das steht ja eigentlich auch in der ODFS. Ich versteht bloß nicht, warum EINE Stunde? Server und Client stehen in derselben Zeitzone MESZ und das sind 2 Stunden Unterschied zu UTC. Wie kommt aber die eine Stunde zustande? Ich will die wieder drauf addieren, aber nicht stumpf als Konstante, sondern ich will verstehen, wie genau diese Differenz zustande kommt und die wenn möglich abfragen und addieren.
Und hier noch die zweite Frage:
wenn ich den obigen SET-Aufruf mit timeInMillis statt milliseconds mache, also so...
$CMS_SET(setNewDateTime, stDate.plus(stTime.timeInMillis))$
...dann bekomme ich einen Nullpointer. Durch die Vorbelegung ist stTime aber nie leer, sondern hat immer einen Wert. Ich dachte immer der Rückgabewert beider Methoden wäre identisch, aber das ist wohl nicht so? Worin besteht der Unterschied?
Grüße
Matthias
-
Author: matthiasforberg - 4/22/2015 9:52
Zur Info, ich habe eine Lösung gefunden (aber besonders elegant finde ich die immer noch nicht).
Folgender Vergleich des "Null-Datums" hat mich auf die Idee gebracht. Ich erzeuge mir ein Datum, von dem ich erwarte, dass es in Millisekunden ausgegeben Null sein muss:
$CMS_VALUE(class("java.util.Date").new(70,0,1,0,0,0).format("yyyy-MM-dd HH:mm:ss"))$
$CMS_VALUE(class("java.util.Date").new(70,0,1,0,0,0).milliseconds)$
Ausgabe:
1970-01-01 00:00:00
-3600000
Obwohl das formatierte Datum richtig mit 0:00 Uhr ausgegeben wird, haben die Millisekunden einen Offset von -1 Stunde.
Lösung:
Ich setze ganau diesen Offset als Konstante (in den Projekteinstellungen):
$CMS_SET(psMillisecondsOffset, -(class("java.util.Date").new(70,0,1,0,0,0).milliseconds))$
Und beim Addieren von Datum und Uhrzeiten gebe ich den noch dazu:
$CMS_SET(setDateTimeNew, stDate.plus(stTime.milliseconds + psMillisecondsOffset))$
Jetzt weiß ich zwar immer noch nicht, warum dieser Offset entsteht, aber immerhin korrigiere ich ihn mit sich selbst. Sollte er also doch mal 0 sein, passt es hoffentlich auch.
(Im Internet habe ich übrigens Java-Forumseinträge von genau diesem Problem gefunden. Die haben aber keine Lösung gefunden, deswegen verweise ich hier nicht darauf.)
Viele Grüße
Matthias
0
Vous devez vous connecter pour laisser un commentaire.
Commentaires
1 commentaire