Gérer le BUG PHP strtotime

coldplay.xixi
Libérer: 2023-04-08 19:04:01
avant
3808 Les gens l'ont consulté

Gérer le BUG PHP strtotime

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"))
Copier après la connexion

Sortie

2020-12-01
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

. 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
Copier après la connexion

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!

Étiquettes associées:
source:liqingbo.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal