it-swarm.com.de

Datum oder DateTime in Datenbank für Komponentenentwicklung mit Zeitzonen?

Unsere Komponente verwaltet die Fernsehprogramme, daher sind Datum und Uhrzeit von entscheidender Bedeutung - hier das Szenario:

  1. Unser Server und die meisten Produzenten sind alle auf lokaler, pazifischer Zeit (America/Los_Angeles, UTC + 8).
  2. Joomla ist mit der Zeitzone "America/Los_Angeles" (public $offset = 'America/Los_Angeles';) weil das IS die Zeitzone, in der wir sind.
  3. Die Datenbank hat ein date -Feld, das angibt, wann die Episode geplant ausgestrahlt werden soll - die tatsächliche Zeit ist unbekannt.
  4. Es gibt auch ein datetime -Feld, das angibt, wann die Episode tatsächlich ausgestrahlt wurde, einschließlich der Sendezeit.

Die fragliche Episode hat das geplante Datum "2015-01-02" (Zeit ist unbekannt). Bei Verwendung eines Kalenderfeldtyps wird immer der 01.01.2015 angezeigt, vermutlich, weil standardmäßig 00:00:00 als Uhrzeit eingestellt ist und 8 Stunden aufgrund des Versatzes abgezogen werden.

Die Frage lautet also:

  1. Hat der Kalendertyp einen Fehler, weil es sich um einen Kalender handelt, nicht um eine Uhr, daher sollte die Zeit nicht berücksichtigt werden.
  2. oder sollte Joomla so konfiguriert sein, dass es die UTC-Zeitzone verwendet?
  3. oder vermisse ich hier etwas grundlegendes?

Und schließlich, wenn das angezeigte Datum "schwankt", gibt es eine Best-Practice-Methode, um dem Benutzer mitzuteilen, welche Zeitzone im Spiel ist? d.h. die Folge wird am 2. Januar Ortszeit ausgestrahlt, der Kalender zeigt jedoch den 1. Januar an.

Ich entschuldige mich für die allgemeine Verwirrung bei der Frage - ich habe dies ein wenig verfolgt und bin mir nicht sicher, auf welchen Prämissen der Zeitzone Joomla ausgeführt wird, also wie hoch die erwartete Ausgabe sein sollte.

Zusätzlich:

Ich benutze nicht JHtml::calendar direkt, aber über mein Formular:

<field name="first_aired" type="calendar"
    label="COM_PASS_EPISODES_EPISODES_FIRST_AIRED_PLANNED_LABEL"
    description="COM_PASS_EPISODES_EPISODES_FIRST_AIRED_DESC"
    class="required span2 validate-airdate"
    default="NOW"
    format="%Y-%m-%d"
    />

Der Code in libraries\joomla\form\fields\calendar.php tut es, dann benutzt es einfach

return JHtml::_('calendar', $this->value, $this->name, $this->id, $format, $attributes);

Weitere Entdeckung

In den Kalenderfeld Dokumenten wird angegeben, dass nur SERVER_UTC oder USER_UTC für das optionale filter -Element zulässig sind. Wenn Sie dies weglassen oder "" USER_UTC als Standard festlegen, aber indem Sie irgendetwas Ungültiges angeben überspringt der Code, der den Versatz hinzufügt, also zeigen Sie das tatsächliche Datum an, unabhängig davon, ob Sie eine Zeit haben oder nicht.

3
GDP

Wie oben in den Kommentaren angegeben, wird das Kalenderfeld in UTC in der Datenbank gespeichert. Aber ... nur, wenn Sie filter="USER_UTC" Oder filter="SERVER_UTC" In der XML-Datei verwenden und Ihr Formular dann mit der validate() -Methode validieren. Die Magie geschieht in der filterField () -Methode der JForm -Klasse, die den Wert in UTC konvertiert.

Wenn Sie das Datum einstellen, sollten Sie immer an Ihre Ortszeit denken. Wenn Ihre Episode also das geplante Datum "2015-01-02" (UTC) hat, ist Ihre Ortszeit UTC und auf dem Server wird "America/Los_Angeles" (UTC-8) ausgeführt, und Sie stellen dann "2015-01-02" ein Das Kalenderfeld sollte für Sie "2015-01-02" anzeigen, nicht jedoch "2015-01-01". Wenn Sie beispielsweise versuchen, Ihre Zeitzone auf UTC-1 zu ändern, sollte "2015-01-01" angezeigt werden, da dies "2015-01-01 23:00:00" ist. Aber für alle auf der Website wird es "2015-01-01 16:00:00" (UTC-8) sein.

Aber es gibt ein merkwürdiges Verhalten. Wenn Sie diesen Filter weglassen, ist der Anzeigewert standardmäßig USER_UTC. Es ist okay. Wenn Sie das Formular validieren, wird USER_UTC Nicht als Filter verwendet und der Wert wird unverändert gespeichert. Das Ergebnis ist offensichtlich und verwirrend - das Kalenderfeld verschiebt immer die Zeit. Wenn Sie es also weglassen, sollten Sie selbst in UTC konvertieren.

Ist es ein Bug? Ich bin mir nicht sicher.

P.S. Ich denke, wir sollten dies zu doc hinzufügen?

1
Dmitry Rekun