Gestion des bugs de PHP strtotime
Strtotime récemment utilisé combiné avec -1 mois, +1 mois, le mois suivant pour obtenir le mois précédent ou le mois prochain Date du mois, mais je viens de voir un article et je me rends compte qu'utiliser strtotime pour obtenir directement la date est encore un peu bug
BUG
Par exemple, date :
$today = '2020-12-31'; echo date("Y-m-d",strtotime("$today -1 month"))
Sortie
2020-12-01
Comme le montre la sortie ci-dessus, la sortie est toujours de décembre 2020
Analyse :
Faites-le d'abord - 1 mois, puis il est actuellement 31-07, et après en soustraire un, c'est 31-06.
Faites à nouveau la normalisation des dates, car juin n'a pas de 31, donc c'est comme 2 :60 est égal à 3h00, le 31 juin est égal au 1er juillet
La logique est-elle très "claire" ? On peut aussi vérifier manuellement la deuxième étape, comme :
var_dump(date("Y-m-d", strtotime("2020-12-31"))); // 输出2020-12-01
Dans autrement dit, tant que les grands et les petits mois sont impliqués. Le dernier jour du mois, il peut y avoir cette confusion. On peut aussi facilement vérifier d'autres mois similaires pour confirmer cette conclusion :
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2020-12-31")))); // 输出2020-12-03 var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2020-08-31")))); // 输出2020-10-01 var_dump(date("Y-m-d", strtotime("next month", strtotime("2020-01-31")))); // 输出2020-03-03 var_dump(date("Y-m-d", strtotime("last month", strtotime("2020-03-31")))); // 输出2020-03-03
. Solution
De PHP5 À partir de .3, date a ajouté une série de phrases correctives pour clarifier ce problème, à savoir "premier jour de" et "dernier jour de", ce qui signifie que vous pouvez limiter la date pour que la date ne soit pas automatiquement "normalisée" :
var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2020-03-31")))); //输出2020-02-28 var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2020-08-31")))); //输出2020-09-01 var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2020-01-31")))); //输出2020-02-01 var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2020-03-31")))); //输出2020-02-28
S'il s'agit d'une version antérieure à 5.3, vous pouvez utiliser mktime ou similaire pour ignorer tous les jours. Par exemple, limitez-les simplement au. Le 1er de chaque mois, mais il est préférable d'utiliser directement le premier jour.
Tutoriel recommandé : "Tutoriel vidéo PHP"
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!