Maison  >  Article  >  développement back-end  >  Comment résoudre l'erreur lors de la conversion de dates au-delà de 2038 en PHP

Comment résoudre l'erreur lors de la conversion de dates au-delà de 2038 en PHP

小云云
小云云original
2018-02-10 13:23:501864parcourir

J'écris actuellement une interface de projet. Lors du test, il a été constaté que le fonctionnement normal était testé sur le serveur, mais qu'il y avait toujours un problème localement. Après une enquête étape par étape, le problème de verrouillage final était dû au fait que la fonction strtotime renvoyait une valeur fausse, provoquant l'échec de l'insertion des données dans la base de données.

Le même code a des résultats d'exécution différents. La raison est que l'environnement est incohérent. Soit la version PHP est différente, soit le nombre de bits est différent.

Cet article vous présente principalement la solution au problème de la conversion PHP des dates au-delà de 2038. L'article donne une solution détaillée et facilite la compréhension et l'apprentissage pour tout le monde grâce à un exemple de code. Les amis qui en ont besoin sont. ci-dessous Jetons un coup d'œil, j'espère que cela pourra aider tout le monde.

Mon ordinateur est en 64 bits. Il y a une incohérence dans le nombre de bits en PHP. Le serveur utilise 64 bits, alors que mon serveur local est en 32 bits. Et strtotime est passé dans une chaîne 2050-1-1 23:59:59. Ce paramètre est supérieur à 2038-1-19 03:14:07, il renvoie donc false directement sous PHP 32 bits, alors que PHP 64 bits. n’est pas affecté par l’Influence.

Vulnérabilité Y2K38

La cause première des problèmes ci-dessus est la vulnérabilité Y2K38, également connue sous le nom de bug du millénaire Unix.

Systèmes 32 bits ou PHP

Cette vulnérabilité affectera tous les PHP et autres langages de programmation qui utilisent des entiers d'horodatage UNIX pour enregistrer le temps sous les systèmes 32 bits. La durée maximale pendant laquelle une variable entière peut être enregistrée est le 19 janvier 2038, 03:14:07. Une fois ce délai dépassé, la valeur entière débordera.

Système 64 bits ou PHP

La date la plus éloignée pouvant être enregistrée sous le système 64 bits est 21 fois l'âge actuel de l'univers - 29,2 milliards d'années. Il ne sera donc pas concerné par cette vulnérabilité.

Comment détecter

Comment savoir si votre système est affecté par cette vulnérabilité. C'est très simple, il suffit d'utiliser strtotime pour convertir une date supérieure au 19 janvier 2038 03:14:07. Ou utilisez la fonction date pour convertir un horodatage supérieur à 2147454847 en date.

Ce qui suit est une démonstration détaillée

Méthode 1

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

Si le résultat ci-dessus renvoie 2050-12-31 23:59:59, alors là n'y a pas de problème. S'il renvoie 1914-11-25 09:31:43, il sera affecté.

Méthode 2

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

Si le résultat ci-dessus renvoie 2556115199, alors c'est normal. Si false est renvoyé, cela sera également affecté.

Solution

Option 1

Changez le système et PHP en 64 bits. Ce coût est relativement élevé, mais il peut résoudre définitivement le problème.

Option 2

Après la version PHP5.2, une fonction DateTime est fournie pour résoudre temporairement le problème.

// 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

La manipulation des dates via la classe DateTime ne sera pas affectée par la vulnérabilité Y2K38 et peut être prise en charge jusqu'au 31 décembre 9999

Recommandations associées :

Analyse d'instance de conversion de date et de vacances php

Un résumé de l'utilisation du tableau de dates php

Date PHP pour horodater, la date spécifiée la date est convertie en horodatage

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn