Frage

Ich dachte STAMP mit dem Datum + Zeit zu speichern, aber ich gelesen, dass es eine Beschränkung des Jahres 2038 auf sich. Statt meine Frage in der Masse zu fragen, zog ich es zu brechen in kleine Teile, so dass es einfach für Benutzer Anfänger als auch zu verstehen. Also meine Frage (n):

  1. Was genau das Jahr 2038 Problem ist?
  2. Warum tritt es auf, und was passiert, wenn es auftritt?
  3. Wie wir es lösen?
  4. Gibt es mögliche Alternativen zu verwenden es, die nicht ein ähnliches Problem dar?
  5. Was können wir zu den bestehenden Anwendungen zu tun, die TIMESTAMP verwenden, das so genannte Problem zu vermeiden, wenn es auftritt wirklich?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich habe dies als Community Wiki markiert, so fühlen sich frei in Ihrer Freizeit zu bearbeiten.

Was genau das Jahr 2038 Problem ist?

"Das Jahr 2038 Problem (auch als Unix Millennium Bug, Y2K38 Analogie zur Y2K-Problem bekannt) können einige Computer-Software verursachen vor oder im Jahr scheitern 2038. Das Problem die gesamte Software und Systeme betrifft, die System speichern Zeit als ein 32-Bit-integer-und interpretieren diese Zahl als die Anzahl der Sekunden seit dem 00.00.00 UTC am 1. Januar 1970. "


Warum tritt es auf, und was passiert, wenn es auftritt?

Die Zeiten jenseits 03.14.07 UTC am Dienstag, 19. Januar 2038 wird ‚Wrap-around‘ und intern als negative Zahl gespeichert werden, die diese Systeme als eine Zeit in 13. Dezember interpretieren, 1901 statt in 2038 auf die Tatsache Dies ist darauf zurückzuführen, dass die Anzahl der Sekunden seit der UNIX-Epoche (1. Januar 1970 00:00:00 GMT) wird ein maximalen Wert des Computers auf eine 32-Bit-Ganzzahl mit Vorzeichen überschritten hat.


Wie lösen wir das?

  • Verwendung langer Datentypen (64 Bit genügt)
  • Für MySQL (oder MariaDB), wenn Sie die Zeitinformationen nicht benötigen betrachtet den DATE Spaltentyp verwenden. Wenn Sie eine höhere Genauigkeit benötigen, verwenden DATETIME statt TIMESTAMP. Beachten Sie, dass DATETIME Spalten speichern keine Informationen über die Zeitzone, so dass Ihre Anwendung müssen wissen, welche Zeitzone verwendet wurde.
  • Weitere mögliche Lösungen auf Wikipedia beschrieben
  • Warten Sie MySQL Devs diesen Fehler zu beheben vor einem Jahrzehnt berichtet über.

Gibt es mögliche Alternativen es zu verwenden, die nicht ein ähnliches Problem dar?

Versuchen Sie, wo immer möglich, große Typen zu verwenden für Daten in Datenbanken zu speichern. 64-Bit ist ausreichend - eine lange, lange Art in GNU C und POSIX / SuS oder sprintf('%u'...) in PHP oder die bcmath Erweiterung


Was sind einige potentiell Verwendung brechen Fällen, auch wenn wir in 2038 noch nicht sind?

So ein MySQL DATETIME- hat eine Reihe von 1000- 9999, aber TIMESTAMP hat nur eine Reihe von 1970-2038. Wenn Ihr System speichert Geburtsdatum, zukünftige Vorwärtsdaten (zum Beispiel 30 Jahre Hypotheken) oder ähnliche, Sie gehen bereits in diese Fehler laufen. Auch hier nicht TIMESTAMP verwenden, wenn dies ein Problem sein wird.


Was können wir zu den bestehenden Anwendungen zu tun, die TIMESTAMP verwenden, das so genannte Problem zu vermeiden, wenn es auftritt wirklich?

Ein paar PHP-Anwendungen werden immer noch um in 2038, obwohl es schwer ist, wie die Bahn voraussehen kaum eine Vermächtnis-Plattform vor.

Hier ist ein Verfahren zur Herstellung eines Datenbanktabellenspalte zu verändern konvertieren TIMESTAMP DATETIME. Es beginnt mit einer temporären Spalte zu erstellen:

# rename the old TIMESTAMP field
ALTER TABLE `myTable` CHANGE `myTimestamp` `temp_myTimestamp` int(11) NOT NULL;

# create a new DATETIME column of the same name as your old column
ALTER TABLE `myTable` ADD `myTimestamp` DATETIME NOT NULL;

# update all rows by populating your new DATETIME field
UPDATE `myTable` SET `myTimestamp` = FROM_UNIXTIME(temp_myTimestamp);

# remove the temporary column
ALTER TABLE `myTable` DROP `temp_myTimestamp`

Ressourcen

Andere Tipps

Wenn UNIX-Zeitstempel mit Daten zu speichern, verwenden Sie tatsächlich ein 32-Bit-Integer, die Zählung der Anzahl der Sekunden seit 1970-01-01 hält; finden Sie unter Unix Zeit

Die 32-Bit-Zahl wird in 2038. Überlauf, ist das 2038 Problem.


Um dieses Problem zu lösen, müssen Sie nicht ein 32-Bit-UNIX-Zeitstempel verwenden, um Ihre Reisedaten zu speichern - was bedeutet, wenn MySQL verwenden, sollten Sie nicht verwenden TIMESTAMP, aber DATETIME (siehe 10.3.1 Die DATETIME-, DATE und TIMESTAMP-Typen ).

  

Der DATETIME Typ wird verwendet, wenn Sie   brauchen Werte, die sowohl Datum enthalten und   Zeitinformationen. Der unterstützte Bereich   ist '1000-01-01 00:00:00' zu   '9999-12-31 23:59:59'.

     

Der TIMESTAMP Datentyp hat eine Reichweite   von '1970-01-01 00:00:01' UTC   '2038-01-19 03:14:07' UTC.


Die (wahrscheinlich) Beste, was Sie für Ihre Anwendung tun können, um zu vermeiden / zu beheben dieses Problem ist nicht TIMESTAMP zu verwenden, aber DATETIME für die Spalten, die Daten enthalten müssen, die nicht zwischen 1970 und 2038.

Eine kleine Anmerkung, aber: es gibt eine sehr hohe wahrscheinlich (statistisch gesehen) , dass Ihre Anwendung wird ganz ein paar Mal vor 2038 ^^ Also vielleicht neu geschrieben worden sind, wenn Sie don ‚t mit Terminen in der Zukunft zu tun haben, werden Sie nicht um dieses Problem zu nehmen mit der aktuellen Version der Anwendung ...

Eine schnelle Suche auf Google tut den Trick: Jahr 2038 Problem

  1. Das Jahr 2038 Problem (auch als Unix Millennium Bug, Y2K38 Analogie zur Y2K-Problem bekannt) können einige Computer-Software verursachen vor oder im Jahr scheitern 2038
  2. Das Problem betrifft alle Software und Systeme, die Systemzeit als einen 32-Bit-Integer speichern, und diese Zahl als die Anzahl der Sekunden interpretieren seit 00.00.00 UTC am 1. Januar 1970. Das letzte Mal, dass seine vertreten diese Weise 03.14.07 UTC am Dienstag 19. Januar 2038. der Zeiten werden „Wrap-around“ über diesen Moment ist und intern als negative Zahl, die diese Systeme im Jahr 1901 als Datum statt 2038 gespeichert werden
  3. Es gibt keine einfache Lösung für dieses Problem für bestehende CPU / OS-Kombinationen, vorhandene Dateisysteme oder bestehende binäre Datenformate

http://en.wikipedia.org/wiki/Year_2038_problem hat die meisten der Details

Zusammenfassung:

1) + 2) Das Problem ist, dass viele Systeme speichern aktuelle Informationen als 32-Bit-int gleich die Anzahl der Sekunden seit dem 1.1.1970 unterzeichnet. Der letzte Termin, der wie folgt gespeichert werden kann, ist 3.14.07 UTC am Dienstag, 19. Januar 2038 Wenn dies der int geschieht, wird „Wrap-around“ und als eine negative Zahl gespeichert werden, die im Jahr 1901 als Datum interpretiert wird. Was genau dann passieren wird, zu System variiert von System aber es genügt wohl zu sagen, wird für jeden von ihnen nicht gut sein!

Für Systeme, die nur speichern Termine in der Vergangenheit, dann ich denke, Sie nicht für eine Weile kümmern müssen! Das Hauptproblem ist mit Systemen, die mit Terminen in der Zukunft arbeiten. Wenn Ihr System muss mit Daten 28 Jahre in der Zukunft arbeiten, dann sollten Sie sich Gedanken beginnen jetzt!

3) Verwenden eines der alternativen Datumsformate vorhanden oder auf ein 64-Bit-System bewegen und die 64-Bit-Ganzzahl verwenden. Oder für Datenbanken verwenden, um ein alternativen Zeitstempel-Format (zB für MySQL verwenden DATETIME-)

4) 3!

5) 4 !!! ;)

Bros, wenn Sie PHP verwenden müssen Zeitstempel angezeigt wird, ist dies die beste PHP-Lösung, ohne von UNIX_TIMESTAMP Format zu ändern.

Verwenden Sie eine custom_date () Funktion. Innen ist es, verwenden Sie die Datetime. Hier ist die Lösung Datetime .

Solange Sie UNSIGNED BIGINT (8) als Zeitstempel in der Datenbank haben. Solange Sie PHP 5.2.0 ++

haben

Als ich will did't etwas aktualisieren, fragte ich mein Back-End (MSSQL), um diese Arbeit zu tun, anstatt PHP!

$qry = "select DATEADD(month, 1, :date) next_date ";
$rs_tmp = $pdo->prepare($qry);
$rs_tmp->bindValue(":date", '2038/01/15');
$rs_tmp->execute();
$row_tmp = $rs_tmp->fetch(PDO::FETCH_ASSOC);

echo $row_tmp['next_date'];

Kann keine effiziente Art und Weise sein, aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top