Ajout d'un mois à une DateTime PHP

Signaler
Messages postés
47
Date d'inscription
dimanche 27 décembre 2009
Statut
Membre
Dernière intervention
17 septembre 2020
-
Messages postés
47
Date d'inscription
dimanche 27 décembre 2009
Statut
Membre
Dernière intervention
17 septembre 2020
-
Bonjour,

J'ai 2 tableaux présentant sur 2 colonnes les données journalières du mois en cours et du suivant. Ces tableaux sont alimenté par une table MySQL, contenant notamment un champ "DateCivil" et un champ "Commentaires". La sélection du mois à afficher est faite à partir de la date actuelle, à laquelle on ajoute un mois pour le tableau du mois suivant. L'entête du tableau indique le mois et l'année concernée (balises th avec un colspan 2).
Tout fonctionne bien, ... sauf lorsque l'on est au mois de décembre.
Là, nous devrions avoir en titre par exemple Décembre 2020 pour le mois en cours et Janvier 2021 pour le mois suivant... mais pour ce dernier mois il s'affiche janvier 2020. Par contre, les données journalières de janvier sont bien celles de 2021.
Je vous livre le code qui aboutit à ce problème :

<div class="texteAccueil">
		
			<table class="table">
				<th colspan="2" class="th centre">
				<?php echo ucfirst(utf8_encode(strftime('%B %G', strtotime($row['DateCivil']))));?>
				</th>
				<?php
				WHILE($row)
					{	
					echo '<tr class="'.$row['CodeCouleur'].'"><td class="td80">'.ucfirst(utf8_encode(strftime('%A %e', strtotime($row['DateCivil'])))).'</td><td class="td300">'.$row['Commentaires'].'</td></tr>';
					$row=$req->fetch();
					}
				$req->closeCursor();
				?>
					
				<th colspan="2" class="th"></th>
			</table>
		</div>
		
		<!--affichage du mois suivant-->
		<div class="texteAccueil">
			
			<?php
		
			if($date->format('d') == 31)
				{	
				$date -> modify("-1 day + 1 month");
				}
	

			else
				{
				$date -> modify("+ 1 month");		
				}

			$mois_sup=$date->format('Y-m');	

			$req->execute(array($mois_sup.'%'));
			$row=$req->fetch();
			?>
			
			<table class="table">
				<th colspan="2" class="th centre">
				<?php echo ucfirst(utf8_encode(strftime('%B %G', strtotime($row['DateCivil']))));?>
				</th>
				
				<?php
				WHILE($row)
					{	
					echo '<tr class="'.$row['CodeCouleur'].'"><td class="td80">'.ucfirst(utf8_encode(strftime('%A %e', strtotime($row['DateCivil'])))).'</td><td class="td300">'.$row['Commentaires'].'</td></tr>';
					$row=$req->fetch();
					}
				$req->closeCursor();
				?>
				<th colspan="2" class="th"></th>
			</table>
</div>


Voilà, mon soucis. Si quelqu'un ou quelqu'une à une idée, qu'il en soit remercié par avance.

Christian

Configuration: Windows / Edge 85.0.564.51

4 réponses

Messages postés
29557
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 septembre 2020
2 778
Bonjour


<?php

$date -> modify("+ 1 month");
 
//Date du dernier jour du mois
echo $date->format('Y-m-t');


Messages postés
47
Date d'inscription
dimanche 27 décembre 2009
Statut
Membre
Dernière intervention
17 septembre 2020

Bonsoir Jordane,
Merci de m'avoir répondu rapidement.
Je pensais avoir répondu, mais ?
Mon problème n'est pas d'afficher tel jour du mois, le script a pour but d'afficher tous les jours du mois en cours (ici, tout va bien) et tous les jours du mois suivant. Il en résulte que la variante date() est réduite à l'année et au mois, ce qui permet bien de sélectionner tous les jours.
2 difficultés se présentaient pour l'affichage du mois suivant :
1 - lorsque la date du jour actuel tombe un 31, l'ajout d'un mois donne 2 mois plus loin (exemple, si nous sommes le 31 mars, le mois suivant sera le mois de mai. Cette difficulté est réglée par mon if :

<?php
if($date->format('d') == 31)
{
$date -> modify("- 1 day + 1 month");
}

else
{
$date -> modify("+ 1 month");
}

$mois_sup=$date->format('Y-m');
?>

La variable $mois_sup sert de sélecteur sur la colonne "DateCivil" de la table. Ce script fonctionne bien, sauf lorsque l'on affiche la page au mois de décembre..

2 - Lorsque la date actuelle est le mois de décembre.
C'est ici que je rencontre le problème objet de mon sujet.
Je rappelle que les données sont présentées dans deux tableaux, l'un pour les jours du mois en cours, l'autre pour les jours du mois suivant. Chaque tableau est constitué d'une ligne <th></th> dans laquelle est affiché le mois et l'année considéré, et de plusieurs lignes <td></td> (entre 28 et 31) affichant les jours.
Lorsque l'on affiche la page au mois de décembre, les données de janvier sont :
. exactes pour les jours,
. erronées pour le titre. Je m'explique : le nom du mois est correctement affiché (Janvier), mais l'année est celle du jours de l'affichage, donc l'année précédente. Par exemple, si j'affiche la page au mois de décembre 2020, j'aurais comme résultat dans le premier tableau, Décembre 2020 et dans le second tableau, Janvier 2020, alors que logiquement je devrais avoir Janvier 2021. Les jours affichés sont bien ceux du mois de janvier 2021. La date renseignée dans la colonne "DateCivil" dans la table agenda est bien "2021-01-01" sur la ligne du titre ainsi que sur la ligne correspondant au premier jour de janvier.
J'ai peut-être été un peu long dans mon explication, mais le problème n'est pas simple à expliquer.

A toutes fins utiles, le site est "paroisse-saint-nauphary.net" onglet agenda.
Très cordialement,
Christian
Messages postés
29557
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 septembre 2020
2 778
Je n'ai pas tout lu....
mais ....
Si tu connais l'année et le mois en cours....
Dans ce cas, le mois suivant sera toujours le mois +1 du premier jour du mois ...
$date = date("Y-m-01"); .// premier jour du mois actuel
$newdate = strtotime ( '+1 month' , strtotime ( $date ) ) ; // premier jour du mois suivant
Messages postés
47
Date d'inscription
dimanche 27 décembre 2009
Statut
Membre
Dernière intervention
17 septembre 2020

La formule donne comme résultat 2678400 ce qui correspond au nombre de secondes dans un mois de 31 jours, et non le premier jour du mois suivant.
Messages postés
12207
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 septembre 2020
688
peut-être:
$date = date("Y-m-01"); // premier jour du mois actuel
$date -> modify("+ 1 month"); // premier jour du mois suivant
Messages postés
29557
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
17 septembre 2020
2 778
Ah oui,
j'ai oublié de remettre au format date ...... mais bon... franchement... tu ne cherches pas beaucoup...
Messages postés
47
Date d'inscription
dimanche 27 décembre 2009
Statut
Membre
Dernière intervention
17 septembre 2020

Si si je cherches, je ne voulais pas te froisser, mais simplement faire remarquer cet oubli...

D'ailleurs mes recherches me conduisent à penser que le problème ne vient pas du script de sélection des données, mais de celui d'affichage du titre des tableaux. En effet, si je supprime les fonctions de conversion (strftime() et strtotime()), j'ai bien la bonne date qui s'affiche au format 01-01-2021 par exemple.

Je continue mes recherches et reviendrai sur le forum pour donner la solution ,,, ou solliciter encore de l'aidde!

En tout cas, merci Jordane de t'être investie sur mon problème.
Christian