Heim  >  Artikel  >  Backend-Entwicklung  >  So beheben Sie den Fehler beim Konvertieren von Datumsangaben nach 2038 in PHP

So beheben Sie den Fehler beim Konvertieren von Datumsangaben nach 2038 in PHP

小云云
小云云Original
2018-02-10 13:23:501928Durchsuche

Ich schreibe gerade eine Projektschnittstelle. Beim Test stellte sich heraus, dass auf dem Server die normale Funktion getestet wurde, lokal jedoch immer ein Problem auftrat. Nach einer schrittweisen Untersuchung ergab sich, dass das endgültige Sperrproblem darauf zurückzuführen war, dass die Funktion strtotime einen falschen Wert zurückgab, was dazu führte, dass das Einfügen der Daten in die Datenbank fehlschlug.

Derselbe Code hat unterschiedliche Ausführungsergebnisse. Der Grund dafür ist, dass die Umgebung inkonsistent ist. Entweder ist die PHP-Version unterschiedlich oder die Anzahl der Bits ist unterschiedlich.

Dieser Artikel stellt Ihnen hauptsächlich die Lösung für das Problem der PHP-Konvertierung von Daten nach 2038 vor. Der Artikel bietet detaillierte Lösungen und erleichtert es jedem, ihn durch Beispielcode zu verstehen und zu lernen Schauen Sie mal rein, ich hoffe, es kann allen helfen.

Mein Computer ist 64-Bit. Es gibt eine Inkonsistenz in der Anzahl der Bits in PHP. Der Server verwendet 64-Bit, während mein lokaler 32-Bit ist. Und strtotime wird in einer Zeichenfolge 2050-1-1 23:59:59 übergeben. Dieser Parameter ist größer als 2038-1-19 03:14:07, sodass er unter 32-Bit-PHP direkt false zurückgibt, während 64-Bit-PHP wird nicht durch Einfluss beeinflusst.

Y2K38-Sicherheitslücke

Die Hauptursache der oben genannten Probleme ist die Y2K38-Sicherheitslücke, auch bekannt als Unix Millennium Bug.

32-Bit-Systeme oder PHP

Diese Schwachstelle betrifft alle PHP und andere Programmiersprachen, die UNIX-Zeitstempel-Ganzzahlen zur Zeiterfassung unter 32-Bit-Systemen verwenden. Die maximale Zeit, die eine Integer-Variable gespeichert werden kann, ist der 19. Januar 2038, 03:14:07. Nach Überschreiten dieser Zeit kommt es zum Überlauf des Ganzzahlwerts.

64-Bit-System oder PHP

Das längste Datum, das unter dem 64-Bit-System gespeichert werden kann, ist das 21-fache des aktuellen Alters des Universums – 29,2 Milliarden Jahre. Daher ist es von dieser Sicherheitslücke nicht betroffen.

So erkennen Sie

So erkennen Sie, ob Ihr System von dieser Sicherheitslücke betroffen ist. Es ist ganz einfach: Verwenden Sie einfach strtotime, um ein Datum zu konvertieren, das größer als der 19. Januar 2038 03:14:07 ist. Oder verwenden Sie die Datumsfunktion, um einen Zeitstempel größer als 2147454847 in ein Datum umzuwandeln.

Das Folgende ist eine detaillierte Demonstration

Methode 1

echo date("Y-m-d H:i:s",2556115199);

Wenn das obige Ergebnis 2050-12-31 23:59:59 zurückgibt, dann ist es soweit ist kein Problem. Wenn 1914-11-25 09:31:43 zurückgegeben wird, ist es betroffen.

Methode 2

var_dump(strtotime("2050-12-31 23:59:59"));

Wenn das obige Ergebnis 2556115199 zurückgibt, dann ist es normal. Wenn false zurückgegeben wird, ist dies ebenfalls betroffen.

Lösung

Option 1

Ändern Sie das System und PHP auf 64-Bit. Dieser Aufwand ist relativ hoch, kann das Problem aber dauerhaft lösen.

Option 2

Nach Version PHP5.2 wird eine Funktion DateTime bereitgestellt, um das Problem vorübergehend zu lösen.

// 1、日期字符串转换为时间戳
$obj = new DateTime("2050-12-31 23:59:59");
echo $obj->format("U"); // 2556115199

// 2、时间戳转换为日期字符串
$obj = new DateTime("@2556115199"); // 这里时间戳前要写一个@符号
$timezone = timezone_open('Asia/HONG_KONG'); // 设置时区
$obj->setTimezone($timezone); 
echo $obj->format("Y-m-d H:i:s"); // 2050-12-31 23:59:59

// 而且DateTime还可以有其他玩法
$obj = new DateTime("2050-12-31 23:59:59");
echo $obj->format("Y/m/d H:i:s"); // 换种方式输入时间字符串2050/12/31 23:59:59

Das Manipulieren von Datumsangaben über die DateTime-Klasse ist von der Sicherheitslücke Y2K38 nicht betroffen und kann bis zum 31. Dezember 9999 unterstützt werden

Verwandte Empfehlungen:

Instanzanalyse der Datums- und Feiertagskonvertierung in PHP

Über die Verwendungszusammenfassung des PHP-Datumsarrays

PHP-Datum in Zeitstempel, angegeben Datum wird in Zeitstempel umgewandelt

Das obige ist der detaillierte Inhalt vonSo beheben Sie den Fehler beim Konvertieren von Datumsangaben nach 2038 in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn