web-dev-qa-db-fra.com

PHP strtotime +1 mois en ajoutant un mois supplémentaire

J'ai une variable simple qui ajoute un mois à aujourd'hui:

$endOfCycle = date("Y-m", strtotime("+1 month"));

Aujourd'hui est janvier 2013, donc je m'attendrais à revenir en 2013-02 mais je reçois 2013-03 à la place. Je ne peux pas comprendre pourquoi il saute au mois de mars.

19
Jason

Il passe au mois de mars car aujourd'hui est le 29 janvier, et l'ajout d'un mois donne le 29 février, qui n'existe pas, donc il passe à la prochaine date valide.

Cela se produira également le 31 de nombreux mois, mais est évidemment plus visible dans le cas de janvier à février car février est plus court.

Si vous n'êtes pas intéressé par le jour du mois et que vous voulez juste qu'il donne le mois suivant, vous devez spécifier la date d'entrée comme le premier du mois en cours. Cela vous donnera toujours la bonne réponse si vous ajoutez un mois.

Pour la même raison, si vous voulez toujours avoir le dernier jour du mois suivant, vous devez commencer par calculer le premier du mois après celui que vous voulez et en soustrayant un jour.

21
SDC

Ce devrait être

$endOfCycle=date('Y-m-d', strtotime("+30 days"));

strtotime

s'attend à recevoir une chaîne contenant un format de date en anglais américain et essaiera d'analyser ce format dans un horodatage Unix (le nombre de secondes depuis le 1er janvier 1970 00:00:00 UTC), par rapport à l'horodatage indiqué maintenant, ou l'heure actuelle si maintenant n'est pas fournie.

tandis que

date

Renvoie une chaîne formatée en fonction de la chaîne de formatage donnée en utilisant l'horodatage entier donné ou l'heure actuelle si aucun horodatage n'est donné.

Voir les pages de manuel pour:

17
One Man Crew

Vous pouvez utiliser ce code pour obtenir le mois suivant:

$ts = mktime(0, 0, 0, date("n") + 1, 1);
echo date("Y-m-d H:i:s", $ts);
echo date("n", $ts);

En supposant qu'aujourd'hui est 2013-01-31 01:23:45 ce qui précède renverra:

2013-02-01 00:00:00
2
4
Salman A

aujourd'hui est le 29 janvier, +1 mois signifie le 29 février, mais comme février se compose de 28 jours cette année, il chevauche le jour suivant, soit le 1er mars

essayez plutôt

strtotime('next month')
2
Blacksonic

Peut-être parce que son 2013-01-29 donc +1 mois serait 2013-02-29 qui n'existe pas donc ce serait 2013-03-01

Tu pourrais essayer

date('m/d/y h:i a',(strtotime('next month',strtotime(date('m/01/y')))));

des commentaires sur http://php.net/manual/en/function.strtotime.php

1
Trudbert