Zugriff auf Daten in PHP nach 2038

Lesezeit: 5 Minuten

Zugriff auf Daten in PHP nach 2038
Moz

Ich verstehe, dass Sie aufgrund der Natur, dass PHP Datumsangaben in Millisekunden darstellt, keine Datumsangaben nach 2038 darstellen können. Ich habe ein Problem, bei dem ich Datumsangaben weit in der Zukunft berechnen möchte. Tausende von Jahren entfernt.

Natürlich kann ich die PHP-Datumsfunktion wegen des Limits nicht verwenden, um dieses Datum darzustellen, aber ich habe etwas auf meiner Seite … Alles, was ich tun möchte, ist das Jahr, den Monat und den Tag zu speichern. Stunde, Minute, Sekunden und Millisekunden sind mir egal.

Gehe ich richtig in der Annahme, dass ich ohne diese zusätzlichen Informationen in der Lage sein sollte, viel weiter in die Zukunft zu rechnen, weil ich bereit bin, viele Informationen zu verwerfen. Ist dies eine Bibliothek, die dies derzeit tut? Wenn nicht, hat jemand einen Rat, wie man dieses Problem angeht?

  • Die Verwendung von Zeitstempeln ist nur bei 32-Bit-Setups ein Problem. PHP, das auf 64-Bit-Rechnern ausgeführt wird, kann Daten über 2038 hinaus darstellen.

    – mario

    16. März 2011 um 0:38 Uhr

  • Als ob PHP 5.6.15 64-Bit-Windows-Build 32-Bit-Zeitstempel verwendet. Außerdem gibt die Funktion strtotime() einen 32-Bit-Zeitstempel mit Vorzeichen zurück (gibt negative Werte für Datumsangaben nach 2038 zurück) und die Funktion date() versteht nur 32-Bit-Zeitstempel mit Vorzeichen.

    – Alexander Prawdin

    27. November 2015 um 5:50 Uhr

  • Ich verwende phpmyadmin und versuche, 2038 datetime in MySQL einzufügen, aber ich erhalte eine Fehlermeldung, keine Ahnung, warum das passiert. Ich arbeite auf einem 64-Bit-System. @KevinEvans irgendwelche Ideen?

    – Petar Wassiljew

    20. Juni 2019 um 18:38 Uhr

Alternativ können Sie auch die verwenden DateTime Klasse, die intern die Zeitkomponenten unabhängig voneinander darstellt. Daher ist es nicht anfällig für die 2038-Beschränkung (es sei denn, Sie verwenden ::getTimestamp).

  • Danke, es sieht so aus, als würde das für mich funktionieren, weil ich keine Zeitstempel verwenden muss, hervorragend 🙂

    – Moz

    16. März 2011 um 0:50 Uhr

  • Gibt es eine Möglichkeit, den Zeitstempel wieder herauszuholen, ohne dass er abgeschnitten wird?

    – HerrMesees

    26. September 2017 um 13:15 Uhr

  • Dies ist nur eine sehr begrenzte Lösung! Was ist, wenn ich filemtime() verwenden möchte, um das Datum einer Datei nach 2038 zu erhalten?

    – Elmue

    17. November 2017 um 19:38 Uhr

  • @Elmue filemtime() verwendet die zugrunde liegende Timespec-Struktur/Ganzzahlgröße des Betriebssystems. Bei 64-Bit-Betriebssystemen werden Daten größer als 2038 zurückgegeben.

    – mario

    17. November 2017 um 21:59 Uhr

  • Völlig richtig. Aber wenn ich ein 64-Bit-Betriebssystem verwenden muss, brauche ich Ihre Antwort nicht mehr. Die DateTime-Klasse ist nutzlos, wenn ich mit Dateizeiten arbeiten möchte. Die richtige Antwort ist also die von alex: Wenn Sie Daten nach 2038 verwenden möchten, MÜSSEN Sie ein 64-Bit-Betriebssystem verwenden. Die DateTime-Klasse ist nur eine sehr begrenzte Problemumgehung. Genau das habe ich in meinem Kommentar geschrieben!

    – Elmue

    17. November 2017 um 22:11 Uhr

Sie könnten Verwenden Sie eine 64-Bit-Plattform.

Die Größe einer Ganzzahl ist plattformabhängig, obwohl ein Maximalwert von etwa zwei Milliarden der übliche Wert ist (das sind 32 Bit mit Vorzeichen). 64-Bit-Plattformen haben normalerweise einen Maximalwert von etwa 9E18.

Quelle.

Finden Sie heraus, ob Ihre Plattform 64-Bit ist var_dump(PHP_INT_SIZE === 8). Wenn TRUEIhr System ist 64-Bit.

  • Eine weitere Möglichkeit, dies zu testen, ist: echo 0x7FFFFFFFFFFFFFFF; was 9223372036854775807 drucken sollte, wenn die Ganzzahl 64 Bit ist.

    – Elmue

    17. November 2017 um 19:33 Uhr

  • Trotzdem, was für eine Schande ist PHP! Warum sind die PHP-Leute nicht in der Lage, eine 32-Bit-Version zu kompilieren, die 64-Bit-Variablen verwendet? Dies kann mit ein paar Compilerschaltern erfolgen.

    – Elmue

    17. November 2017 um 22:13 Uhr

PHP eingeführt hat Terminzeit() Klasse in Version 5.2, um dieses Problem zu lösen. Sie müssen sich jedoch immer noch im 64-Bit-Betriebssystem befinden.

  • Wenn dies zutrifft, ist PHP völlig falsch konzipiert. PHP ist intern in C++ programmiert, was es leicht erlaubt, 64-Bit-Variablen AUCH auf einer 32-Bit-Plattform zu verwenden! (siehe ULONGLONG)

    – Elmue

    17. November 2017 um 19:34 Uhr

Sie haben Recht damit, dass PHP es Ihnen nicht erlaubt, Daten > 2038 nativ zu verarbeiten. Es gibt jedoch Bibliotheken wie z Dieses hier die die Tatsache ausnutzen, dass Gleitkommazahlen 64 Bit sind, sodass Sie dieses Problem bei Bedarf umgehen können. (Alles unter der Annahme, dass Sie ein 32-Bit-System verwenden … wenn Sie 64 Bit verwenden, ist alles in Ordnung).

1646308447 849 Zugriff auf Daten in PHP nach 2038
Jack M.

Vergessen Sie Windows! Auch wenn Sie Apache 64-Bit über Windows 64-Bit ausführen!

$timestamp = strtotime('22-09-2508');
var_dump ($timestamp);
// returns bool false using WAMP 64-Bit over Windows 64 Bit

Wenn Sie Zeitstempel berechnen müssen, verwenden Sie ein 64-Bit-System (nicht Windows):

$timestamp = strtotime('22-09-2508');
var_dump ($timestamp);
// returns int 17000496000 using a LAMP Server

Sie können einen LAMP-Server mit VMWare über Ihr Windows ausführen, und höchstwahrscheinlich wird Ihr endgültiger Host-Server diesen 64-Bit-Dienst ebenfalls verwenden.

Mit anderen Worten:

if (intval("9223372036854775807")==9223372036854775807) {
  // 64-bit
} else {
  // 32-bit
}

Habe es ?

Hinweis: time() und getTimestamp() funktionieren beide in einer 64-Bit-Umgebung (Linux) nach dem Jahr 2038.

  • Als ob PHP 5.6.15 64-Bit-Windows-Build 32-Bit-Zeitstempel verwendet. Außerdem gibt die Funktion strtotime() einen 32-Bit-Zeitstempel mit Vorzeichen zurück (gibt negative Werte für Datumsangaben nach 2038 zurück) und die Funktion date() versteht nur 32-Bit-Zeitstempel mit Vorzeichen.

    – Alexander Prawdin

    27. November 2015 um 5:51 Uhr

  • Es ist VOLLSTÄNDIGER Unsinn zu sagen “Windows vergessen”. Als ob das vom Betriebssystem abhängen würde! PHP ist intern C++-Code. Unter Windows können Sie 64-Bit-Variablen EINFACH auch auf einer 32-Bit-Plattform verwenden. Visual Studio-Header-Dateien definieren seit Jahrzehnten 64-Bit-Typen als ULONGLONG oder LONGLONG. Es ist die Schuld der PHP-Leute, die VIELE Designfehler machen. Die richtige Antwort wäre: „Forget PHP“. Es ist eine Schande, dass PHP immer noch 32-Bit-Ganzzahlen mit Vorzeichen verwendet. Warum bietet PHP keine 64-Bit-Variablen von THE FIRST DAY an, wie es C++, C# und andere tun? Es ist ein schwerwiegender Designfehler in PHP, nicht in Windows!

    – Elmue

    17. November 2017 um 19:25 Uhr

  • Als ob PHP 5.6.15 64-Bit-Windows-Build 32-Bit-Zeitstempel verwendet. Außerdem gibt die Funktion strtotime() einen 32-Bit-Zeitstempel mit Vorzeichen zurück (gibt negative Werte für Datumsangaben nach 2038 zurück) und die Funktion date() versteht nur 32-Bit-Zeitstempel mit Vorzeichen.

    – Alexander Prawdin

    27. November 2015 um 5:51 Uhr

  • Es ist VOLLSTÄNDIGER Unsinn zu sagen “Windows vergessen”. Als ob das vom Betriebssystem abhängen würde! PHP ist intern C++-Code. Unter Windows können Sie 64-Bit-Variablen EINFACH auch auf einer 32-Bit-Plattform verwenden. Visual Studio-Header-Dateien definieren seit Jahrzehnten 64-Bit-Typen als ULONGLONG oder LONGLONG. Es ist die Schuld der PHP-Leute, die VIELE Designfehler machen. Die richtige Antwort wäre: „Forget PHP“. Es ist eine Schande, dass PHP immer noch 32-Bit-Ganzzahlen mit Vorzeichen verwendet. Warum bietet PHP keine 64-Bit-Variablen von THE FIRST DAY an, wie es C++, C# und andere tun? Es ist ein schwerwiegender Designfehler in PHP, nicht in Windows!

    – Elmue

    17. November 2017 um 19:25 Uhr

923100cookie-checkZugriff auf Daten in PHP nach 2038

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

Privacy policy