Heidisql: Falsche Zeitstempelanzeige als Datumswert im Raster

Erstellt am 31. Jan. 2018  ·  5Kommentare  ·  Quelle: HeidiSQL/HeidiSQL

Setzen Sie "Dies ist eine UNIX-Zeitstempelspalte" in den Rasteransichtsoptionen aktiv, um einen UNIX-Zeitstempel als Datumsdarstellung anzuzeigen.

Erwartetes Verhalten

Der folgende Wert (Unix-Zeitstempel) wird als BIGINT in der Datenbank gespeichert:
1098655200
GMT: Sonntag, 24. Oktober 2004, 22:00 Uhr
Berlin: Montag, 25. Oktober 2004 00:00 GMT+02:00 DST

Raster sollte hier angezeigt werden:
2004-10-24 22:00:00 (GMT) oder
2004-11-25 00:00:00 (Lokal)

Aktuelles Verhalten

Raster zeigt:
2004-10-24 23:00:00

Es scheint, dass die aktuelle Zeitzone verwendet wird, um den Wert anzuzeigen, und dies ist GMT+1 (Stand 31.01.2018) in Deutschland, keine Sommerzeit.
Der Wert muss entsprechend der Zeitzone am angegebenen Datum angezeigt werden, das war GMT+2, Sommerzeit aktiv.

Schritte zum Reproduzieren

  1. Erstellen Sie eine BIGINT-Spalte und fügen Sie einen Wert von 1098655200 . ein
  2. Setzen Sie "Rasteransichtsoptionen" auf "Dies ist eine UNIX-Zeitstempelspalte"
  3. Sie erhalten: 2004-10-24 23:00:00
  4. Erwartet: 2004-11-25 00:00:00

Kontext

  • HeidiSQL-Version: 9.5.0.5196
  • Datenbanksystem + Version: MariaDB 10.2.12
  • Betriebssystem: Windows 10, Zeitzone Europa/Berlin
bug

Alle 5 Kommentare

hey @mpaland , läuft deine MariaDB mit der korrekten Zeitzone Europe/Berlin?
Ich handhabe nicht viele Konvertierungen, Zeitstempel schreibt in UTC, nicht wahr? und MySQL in Ihre Zeitzone konvertiert?

Ich habe versucht zu reproduzieren, aber auf den Servern, die ich habe, sind die Zeitzonen nicht installiert :(

@lukinhaspm es ist keine Frage des Servers, es ist nur eine Frage der korrekten Zeitstempeldarstellung in HeidiSQL. Ein UNIX TIMESTAMP ist immer in Sekunden nach 1970-01-01 00:00:00 UTC gemeint.

Sie können einen solchen Zeitstempel strikt in UTC darstellen, was in Ordnung ist, oder in einer bestimmten (meistens der eigenen) Zeitzone. Dazu wird die gültige Zeitzone am Zeitstempeldatum benötigt, nicht am tatsächlichen Datum.
Es scheint, dass HeidiSQL das aktuelle Datum übernimmt. Ich habe noch nicht in den Code geschaut, also ist es nur eine Spekulation.

@mpaland Ich verstehe und stimme zu!

Ich habe das etwas weiter untersucht. Leider scheint die Lösung keine einfache zu sein.
Problematisch sind die komplizierten DST-Regeln (Daylight Saving Time) auf der ganzen Welt und noch schlimmer ihre sich ständig ändernde, nicht konstante Form.
Um die Ortszeit DST für einen bestimmten Epochen-Zeitstempel zu korrigieren, ist es notwendig, die genaue DST-Regel zu kennen, die lokal zum Zeitstempel-Zeitpunkt angewendet wurde.
Eine Konvertierungsbibliothek muss alle Änderungen der DST-Regeln in jedem Land im Laufe der Jahre verfolgen, um den Offset für jeden Punkt in der Vergangenheit zu berechnen.
Windows ignoriert dieses Problem vollständig und konvertiert immer gemäß der _actual_ DST-Regel zum Zeitpunkt der Konvertierung.
Um es richtig zu machen, ist es notwendig, eine der wirklich fortgeschrittenen Zeitzonen-/DST-Bibliotheken im Internet zu verwenden.

Obwohl das meiste von dem, was @mpaland darüber gesagt hat, dass man die DST-Regel kennen muss, die beim Erstellen des Zeitstempels angewendet wird, technisch wahr ist (wenn wir zum Beispiel die Sommerzeit fallen lassen, würden alle Momente, die während der Zeit aufgezeichnet wurden, auf das relative Nicht-Tageslicht "verschoben". Zeit sparen), ist es immer noch möglich, die aktuellen DST-Regeln zu verwenden, um die Zeit für einen Zeitstempel richtig anzuzeigen.

1584975600 und 1585576800 sind beide 16:00 in Europa/Madrid, aber heidisql repräsentiert fälschlicherweise einen von ihnen (je nachdem, ob wir Sommerzeit haben oder nicht)

Es ist möglicherweise möglich, diese Fälle ohne großen Aufwand korrekt anzuzeigen, indem Sie einfach überprüfen, ob die resultierende Zeit auf Sommerzeit sein sollte oder nicht, und den richtigen Offset anwenden.

Auch wenn es keine perfekte Lösung ist, würde ich sagen, dass es wahrscheinlich die meisten Anwendungsfälle abdeckt und die Randfälle wahrscheinlich leicht zu erkennen wären, es ist eher eine kleine Hilfe für Entwickler, um zu überprüfen, ob etwas in Ordnung ist, als eine zuverlässige Anzeige des Endbenutzers sowieso.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen