So speichern Sie UNIX-Zeitstempel mit MySQL

Lesezeit: 3 Minuten

Etwas Hintergrund:

Meine Website hängt stark davon ab, Benutzer über alle möglichen Zeitzonen hinweg zu koordinieren.

Ich verwende Carbon, um meine Zeitzonenkonvertierungen und -berechnungen auf der Serverseite und moment.js auf dem Client zu handhaben.

Als Ergebnis wurde die Designentscheidung getroffen, dass alle Datumsangaben (z. B. die Startzeit eines Ereignisses) als Unix-Zeitstempel gespeichert werden.

Problem

Ich bin etwas verwirrt über die Definition eines “Zeitstempels”. In PHPMyAdmin ist der Zeitstempel kein Unix-Zeitstempel, sondern ein Datumsformat:

2016-10-06 20:50:46

Wenn Sie also ein Standardfeld mit dem aktuellen Zeitstempel haben möchten, erhalten Sie das aktuelle Datum in GMT.

Dies macht die Rückkonvertierung in eine Benutzerzeitzone im Vergleich zu einer Unix-Zeitstempel-Ganzzahl komplizierter …

Frage:

Als welchen Feldtyp soll ich meine Unix-Zeitstempel speichern, die ich derzeit verwende int(11) mit einer Vorgabe von none. Als Erweiterung … gibt es eine Möglichkeit, den aktuellen Unix-Zeitstempel (z. B. 1475971200) standardmäßig in MySQL zu speichern?

  • Sie können das Problem umgehen, indem Sie die Datumszeit von und in den Unix-Zeitstempel konvertieren. Um also einen Unix-Zeitstempel einzufügen, würden Sie ein DATETIME-Feld in Ihrer Tabelle erstellen und den Unix-Zeitstempel damit konvertieren FROM_UNIXTIME(1514789942). Wenn Sie dann den Wert in Unix Timstamp abrufen möchten, tun Sie dies SELECT UNIX_TIMESTAMP(my_datetime_field)

    – Jacques

    1. Januar 2018 um 7:01 Uhr


Ein Unix-Zeitstempel ist eine große ganze Zahl (die Anzahl der Sekunden seit dem 01.01.1970 00:00:00 UTC), also INT(11) ist der richtige Datentyp.

Leider glaube ich nicht, dass es eine Möglichkeit gibt, einen Standardwert anzugeben, der den aktuellen Zeitstempel einfügt. Sie müssen anrufen UNIX_TIMESTAMP() explizit beim Einfügen, und verwenden Sie das. Funktionsaufrufe sind nicht erlaubt DEFAULT Spezifikationen.

  • Warum sind es 11 Bytes?

    – Benutzer

    19. Oktober 2018 um 16:19 Uhr

  • Es sind nicht 11 Bytes, sondern 11 Dezimalziffern, so viele Ziffern kann eine 32-Bit-Zahl anzeigen.

    – Barmar

    19. Oktober 2018 um 20:29 Uhr


  • INT(11) macht den Trick nicht, habe es gerade versucht, speichert 2147483647 für 1623925731158. BIGINT macht den Trick.

    – DBencz

    17. Juni 2021 um 10:45 Uhr

  • @DBencz UNIX_TIMESTAMP() wird in Sekunden gemessen, und die MySQL-Zeitstempelfunktionen unterstützen nur Werte bis zu 2**31-1was passt INT(11). Sie scheinen 3 Ziffern (Millisekunden) hinzugefügt zu haben.

    – Barmar

    17. Juni 2021 um 14:07 Uhr

Benutzeravatar von George Kagan
Georg Kagan

Sie können weiterhin ein vorzeichenloses INT verwenden, aber Sie müssen den Zeitstempel beim Einfügen manuell festlegen (UNIX_TIMESTAMP()).

Oder Sie können den TIMESTAMP-Typ mit dem Standardwert CURRENT_TIMESTAMP (der hinter den Kulissen als Int gespeichert wird) verwenden und ihn bei der Auswahl in einen Int konvertieren:
SELECT UNIX_TIMESTAMP(foo_field) FROM foo_table

Referenz – Ist es möglich, eine Spalte mit einem UNIX_TIMESTAMP-Standard in MySQL zu erstellen?

Eigentlich muss man beides verwenden bigint oder varchar weil das Maximum für int(11) ist 2’147’483’647 (mehr Infos hier).

Dann müssen Sie, wie die vorherigen Antworten sagen, manuell einfügen UNIX_TIMESTAMP()

  • Int(11) reicht aus, Bigint ist nicht erforderlich. Der Unix-Zeitstempel kann ohnehin nicht weiter als bis zum 19. Januar 2038 gehen, da es sich normalerweise um eine vorzeichenbehaftete 32-Bit-Ganzzahl handelt. sehen en.wikipedia.org/wiki/Year_2038_problem

    – Jack O’Neill

    20. März 2018 um 17:06 Uhr

  • Der Unix-Zeitstempel ist Sekunden, nicht Millisekunden. Sie brauchen nicht größer als int(11). Die Leute sind verwirrt, weil Javascript Date.now() stattdessen Millisekunden zurückgibt. du musst es durch 1000 teilen

    – T.S

    12. Februar um 13:37 Uhr

1405480cookie-checkSo speichern Sie UNIX-Zeitstempel mit MySQL

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy