thorsten
Returning Observer

CMS_INPUT_DATE & mode=time: Ausgabe entspricht nicht dem Eingabewert

Jump to solution

Liebe Community,

ich scheitere gerade an einem vermutlich einfachen Problem.

Laut Doku wird bei CMS_INPUT_DATE und Verwendung von mode=time in allen Zeitzonen die gleiche Uhrzeit ausgegeben.

Bei mir ist aber Ausgabewert = Eingabewert + 1 Stunde

Was habe ich übersehen/wo liegt mein Fehler?

Hier die Details:

Version Server: 5.0.210.55494
Java-Version Server: 1.7.0_11

Doku: CMS_INPUT_DATE

Mode

… wird bei mode="date"  und mode="time" in allen Zeitzonen das gleiche Datum bzw. die gleiche Uhrzeit ausgegeben (in der Eingabekomponente, Vorschau und Generierung).

Wird z.B. in der Zeitzone UTC+1 das Datum "01.01.1970" bzw. die Uhrzeit "00:00" eingegeben, wird in allen Zeitzonen "01.01.1970" bzw. "00:00" angezeigt.

Datenquelle

Eingabe:
eingabe.png

Formular:

<CMS_INPUT_DATE name="tt_uhrzeit_start" allowEmpty="yes" allowInput="yes" hFill="no" mode="time" useLanguages="no">

<LANGINFOS>

<LANGINFO lang="*" label="Startzeit" description="Lege die Startzeit fest." format="HH:mm" length="10"/>

</LANGINFOS>

</CMS_INPUT_DATE>

Mapping:

mapping.png

Inhalt in DB:

uhrzeit_start - LONG bzw. bigint(20): 72000000

Ist-Ausgabe:

Sa, 23. Februar 2013 - 21:00 MEZ

Erwartete Ausgabe anhand Doku (Eingabe = Ausgabe):
Sa, 23. Februar 2013 - 20:00 MEZ

Register HTML:

<CMS_HEADER>

     <CMS_FUNCTION name="contentSelect" resultname="fr_st_termine">

           <CMS_PARAM name="schema" value="db" />

           <QUERY entityType="termine">

                <ORDERCRITERIA attribute="datum_start" descending="0" />

                <ORDERCRITERIA attribute="uhrzeit_start" descending="0" />

           </QUERY>

     </CMS_FUNCTION>

</CMS_HEADER>

<ul>

$CMS_IF(!fr_st_termine.isEmpty)$

     $CMS_FOR(_termine, fr_st_termine)$

     <li>

           $CMS_VALUE(_termine.datum_start.toDate().format("EE, dd. MMMM yyyy"))$ - $CMS_VALUE(_termine.uhrzeit_start.toDate().format("HH:mm z"))$</div>

     </li>

     $CMS_END_FOR$

$CMS_END_IF$

</ul>

Danke & Gruß,

Thorsten

0 Kudos
1 Solution

Accepted Solutions
Peter_Jodeleit
Crownpeak employee

Eine Erläuterung zu der Antwort von Stefan: In der Datenbank werden Zeitstempel zur Basis UTC gespeichert. Wenn du das selber in ein Datums-Objekt umwandelst, musst du auch die Anpassung "lokale Zeitzone" zu "UTC" selber bei der Ausgabe berücksichtigen.

Einfacher ist das wahrscheinlich, wenn du die gespeicherte Uhrzeit als "Millisekunden seit Mitternacht" interpretierst.

Allerdings bleibt das Problem (das Stefan im PS erwähnt), das du den gleichen Effekt bei dem Feld "datum_start" hast.

Peter

View solution in original post

0 Kudos
4 Replies
StefanSchulz
I'm new here

Hi,

da vermute ich mal ganz stark, dass die Ausgabe durch die Nutzung von toDate() verfälscht wird, da hier ein lokales Date-Objekt erzeugt wird (inkl. Zeitzonenanpassung). Durch den direkten Zugriff auf die Datenbankspalte erfolgt auch die notwendige Anpassung nicht, wie sie beim Zugriff über das Formularfeld gemacht wird.

Eine einfache Lösung des Problems bei Zugriff über ein Datenbankabfrage fällt mir aktuell allerdings auch nicht ein.

Gruß

Stefan

P.S.: Das Problem wird genau so auch für den Modus date gelten, fällt hier aber nicht auf. Sollte bei negativer Zeitzone sichtbar werden.

Peter_Jodeleit
Crownpeak employee

Eine Erläuterung zu der Antwort von Stefan: In der Datenbank werden Zeitstempel zur Basis UTC gespeichert. Wenn du das selber in ein Datums-Objekt umwandelst, musst du auch die Anpassung "lokale Zeitzone" zu "UTC" selber bei der Ausgabe berücksichtigen.

Einfacher ist das wahrscheinlich, wenn du die gespeicherte Uhrzeit als "Millisekunden seit Mitternacht" interpretierst.

Allerdings bleibt das Problem (das Stefan im PS erwähnt), das du den gleichen Effekt bei dem Feld "datum_start" hast.

Peter
0 Kudos
thorsten
Returning Observer

Danke für die schnelle "Aufklärung".

Hatte die Aussage "wird in allen Zeitzonen "01.01.1970" bzw. "00:00" angezeigt" auch auf die HTML-Ausgabe bezogen. Diese gilt also so nur für die Formularfelder.

Dass toDate() automatisch eine Zeitzonenanpassung macht, hatte ich aufgrund der missverstandenen Doku-Aussage außer acht gelassen 🙂

Danke,

Thorsten

0 Kudos

Der Unterschied ist "(HTML-)Ausgabe über Tabellentemplate" (über die Angabe des Komponentennamens) zu "(HTML-)Ausgabe über das Entity" (über den Spaltennamen). Bei letzterem fehlt eine Zwischenschicht, die für dich solche Dingen wie Zeitzone abstrahierst.

Peter
0 Kudos