Fehlerhafte sprechende Zeitangaben

  • Dieser Fehler ist mir im WCF 2.1 aufgefallen, dürfte aber auch im WSC existieren da sich der betreffende Code nicht wirklich geändert hat.

    Folgendes Problem:

    Zeitstempel die um 0:00 Uhr, 0 Sekunden eines beliebigen Tages erstellt wurden, wie z.B. bei einem Forum-Post zu dieser Zeit, werden nicht korrekt dargestellt. Als Tag wird dann der vorige angezeigt. Gestern statt Heute, Samstag statt Sonntag, usw.


    Ursache ist die _offset Variable die an folgender Stelle initialisiert wird:

    https://github.com/WoltLab/WCF…all/files/js/WCF.js#L3686 bzw. https://github.com/WoltLab/WCF…Date/Time/Relative.js#L58


    Ungefähr 20 Zeilen weiter unten wird mithilfe des Offsets der Timestamp erstellt (var $timestamp = $element.data('timestamp') + this._offset;im WCF, bzw. var elTimestamp = ~~elData(element, 'timestamp') + _offset; im WSC)

    der dann u.a. für Ermittlung des Wochentages genutzt wird.

    Durch dieses Offset (beim Debuggen meist -14 oder -15 Sekunden) rutscht $timestamp dann in den vorigen Tag und der Text für den Wochentag stimmt somit nicht.


    Da ich nicht verstanden oder genauer nachgeforscht habe, wozu dieses Offset da ist, kann ich auch keinen Lösungsansatz nennen. Ich hoffe aber trotzdem, ihr fixt das auch für das WCF. Wie gesagt ist der Code ja quasi identisch.


    Danke

    • Official Post

    _offset ist der Versatz zwischen der Server- und Client-Zeit, damit etwaige Abweichungen nicht zu fehlerhaften Zeitangaben führen. Es kommt immer wieder mal vor, dass die Zeitangaben deutlich abweichen und es so zu Differenzen von einigen Minuten kommen kann. Ohne die Offset-Berechnung lägen alle vergangene Ereignisse innerhalb dieses Zeitfensters in der Zukunft.

  • In diesem Fall führt genau dieses Offset zu falschen Zeitangaben. Wenn ich es nachträglich wieder subtrahiere passt natürlich alles.


    Jetzt sehe ich auch erst, dass diese Variable in der header.tpl gesetzt wird und es sich um die Serverzeit handelt.

    Das bedeutet also, jeder User sieht die Uhrzeit in der Zeitzone des Servers und nicht in seiner eigenen. Sprich, ich poste am 1.1.18 0:00 Uhr und jemand in Washington D.C. liest ihn direkt, sieht dort dann die selbe Uhrzeit stehen. Für ihn ist das aber ein Zeitpunkt in der Zukunft, da er es sich am 31.12.17 18:00 Uhr seiner Zeit anschaut. Das finde ich doch sehr irreführend, zumal in den Tooltips etc. keine Zeitzonen angegeben werden. Selbst wenn die Uhr im Footer eingeblendet wird, sieht man die Zeitzonenangabe nur bei Mouseover.

    Theoretisch müsste im Beispiel die relative Zeit sogar "Morgen" anzeigen, wäre die Logik dafür implementiert ^^


    Es wäre in meinen Augen daher sinnvoller, das Offset völlig zu entfernen und die Zeitstempel unverändert durch den Client rendern zu lassen. Dann gibt's auch keine Probleme mehr mit Abweichungen innerhalb ein und derselben Zeitzone, nur weil Server und Client minimal unterschiedlich ticken.

    Da die Serverzeit nie mit mit allen Clients in Deutschland auf die Sekunde genau übereinstimmen wird, halte ich das Offset für umso problematischer. Einen wirklichen Nutzen sehe ich auch nicht, wie gesagt eigentlich mehr Potenzial zur Verwirrung bei internationalen Communities.


    Alternativ könnte man natürlich auch generell die Sekundendifferenz ignorieren und stattdessen das Offset nur in Minuten-Genauigkeit verrechnen, wenn ihr euer System so beibehalten wollt. Keine vollständige Lösung für das Problem, aber besser als aktuell.


    Edit:

    Habe mal einen Pull Request jeweils fürs WCF 2.1 und sowie WSC erstellt: https://github.com/WoltLab/WCF/pull/2513 bzw. https://github.com/WoltLab/WCF/pull/2514

    In diesem Fall erstmal nur die einfachere Variante mit dem gröberen Offset, da diese gefahrlos ist. Was meinen Hauptvorschlag angeht kenne ich die Hintergründe und Abhängigkeiten nicht, wünsche mir aber natürlich trotzdem dass es in Erwägung gezogen wird. Gerne erstelle ich einen eigenen Vorschlag, falls gewünscht.

    • Official Post

    Das bedeutet also, jeder User sieht die Uhrzeit in der Zeitzone des Servers und nicht in seiner eigenen. Sprich, ich poste am 1.1.18 0:00 Uhr und jemand in Washington D.C. liest ihn direkt, sieht dort dann die selbe Uhrzeit stehen. Für ihn ist das aber ein Zeitpunkt in der Zukunft, da er es sich am 31.12.17 18:00 Uhr seiner Zeit anschaut.

    Das ist nicht richtig, die Uhrzeit wird im Browser entsprechend der Lokalzeit dargestellt. Der Timestamp selbst zählt die Sekunden seit dem 1. Januar 1970 UTC, dadurch hat der Unix-Timestamp weltweit stets den exakt gleichen Wert, nur ergibt er gemäß der lokalen Zeitzone eine andere Uhrzeit (bzw. +/- 1 Tag).


    Es wäre in meinen Augen daher sinnvoller, das Offset völlig zu entfernen und die Zeitstempel unverändert durch den Client rendern zu lassen.

    So einfach ist das nicht, denn das Offset geht in beide Richtungen, d. h. gegenwärtige Ereignisse würden dann in der Zukunft angezeigt. Das entscheidende Problem ist hier, dass man nie weiß, ob die Server- oder Client-Zeit falsch ist - theoretisch können auch beide abweichend sein. Das Offset dient schlicht der Normalisierung dieser Abweichung, eben damit diese keine Rolle mehr spielt.


    Ich habe eher die Vermutung, dass der Datumswechsel nicht korrekt berücksichtigt wird, so dass "00:00" als "gestern" interpretiert wird. Durch die in deinem Fall "passende" Verschiebung von einigen Sekunden wandert der Zeitpunkt in den Folgetag, so dass die Anzeige nun stimmt, dennoch war das Offset nicht die eigentliche Ursache.


    Deine Anpassung hin zu einer lediglich Minuten-genauen Auflösung ist als Lösung auch eher ungeeignet, denn potentiell ist eine Abweichung im offenen Interval (-5,+5) möglich. Theoretisch sind noch höhere Werte denkbar, aber Zeitverschiebung größer 5 Minuten haben ziemlich lustige Auswirkungen, etwa streikende Server-Dienste, daher lasse ich die in der Betrachung außen vor.


    Ich muss mir mal ein paar Testfälle zusammenbauen, damit ich das abschließend beantworten kann.

  • Das ist nicht richtig, die Uhrzeit wird im Browser entsprechend der Lokalzeit dargestellt. Der Timestamp selbst zählt die Sekunden seit dem 1. Januar 1970 UTC, dadurch hat der Unix-Timestamp weltweit stets den exakt gleichen Wert, nur ergibt er gemäß der lokalen Zeitzone eine andere Uhrzeit (bzw. +/- 1 Tag).

    Korrekt.

    Aber durch die Manipulierung des Timestamps mit dem Offset hast du plötzlich keinen UTC Wert mehr. Stell einfach mal deine Zeitzone auf -X Stunden und lade die Seite neu. Wenn du mit der Maus über meinen Post gehst liegt der plötzlich in der Zukunft ;)

    Wie gesagt, weil der Timestamp durch das Serveroffset manipuliert wird und dein Browser diesen Timestamp nach wie vor als UTC behandelt. Das rendern in der Zeitzone des Systems passiert wie du schon sagst auf Clientseite, würde aber nur korrekt angezeigt wenn man den Timestamp eben nicht verfälschen würde.

    • Official Post

    Timestamps sind vollkommen unabhängig von der gewählten Zeitzone. Das Offset dient lediglich dazu, Abweichungen zwischen den Timestamps vom Server und vom Client zu normalisieren, so dass die relative Zeitangabe stets einheitlich ist.


    Stell dir einfach mal vor, dass Computer A mit der Zeit vom Server übereinstimmt, die Uhr auf Computer B aber um 5 Minuten vorgeht (d. h. auch der Timestamp geht um 5 Minuten vor!). Wenn ein Ereignis nun vor 10 Minuten (Server-Zeit) statt gefunden hat, so würde Computer A dies korrekt als "Vor 10 Minuten" darstellen. Bei Computer B wäre das Ergebnis aber "Vor 15 Minuten", auf Grund der zuvor genannten Abweichung von der korrekten Uhrzeit.


    An genau dieser Stelle kommt das Offset zum Tragen, bei dem alle Timestamps vom Server auf Computer B als "-5 Minuten" interpretiert wird, so dass das genannte Ereignis ebenfalls als "Vor 10 Minuten" deklariert wird.

  • Alles was älter als 24 Stunden ist, zeigt (durch das verrechnete Offset) die Zeit auch im Haupttext in der Serverzeit an.

    Wenn ich meine Zeitzone auf New York (GMT-5) umstelle, steht nach Reload weiterhin "Gestern, 1:21" an meinem ersten Post. Dort sollte dann aber "Sonntag, 19:21 Uhr" stehen (ich bin in diesem Szenario ja New Yorker und das war das New Yorker Datum, zu dem es gepostet wurde).


    Edit: Sorry, ich habe mich mächtig selbst verwirrt aufgrund der falschen Darstellung. Natürlich ist die Serverzeit auch ein UTC Zeitstempel und das Offset somit nicht verantwortlich für das Problem. Aktuell weiss ich nicht warum ich diese Zeitstempel, trotz Umstellen der Zeitzone im System, weiterhin in GMT+1 Zeit dargestellt bekomme.

  • Alexander Ebert

    Set the Label from Feedback required to Future fix
  • Marcel Werk

    Set the Label from Future fix to Won’t fix

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!