Ajout d'un mois à une DateTime PHP

Fermé
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020 - 14 sept. 2020 à 00:15
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020 - 17 sept. 2020 à 15:32
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
A voir également:

4 réponses

jordane45 Messages postés 38310 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
14 sept. 2020 à 01:10
Bonjour


<?php

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


0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
Modifié le 16 sept. 2020 à 22:55
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
0
jordane45 Messages postés 38310 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
17 sept. 2020 à 00:42
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
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
17 sept. 2020 à 10:45
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.
0
yg_be Messages postés 23343 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 24 novembre 2024 1 551
17 sept. 2020 à 11:21
peut-être:
$date = date("Y-m-01"); // premier jour du mois actuel
$date -> modify("+ 1 month"); // premier jour du mois suivant
0
jordane45 Messages postés 38310 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
17 sept. 2020 à 12:16
Ah oui,
j'ai oublié de remettre au format date ...... mais bon... franchement... tu ne cherches pas beaucoup...
0
christian82000 Messages postés 47 Date d'inscription dimanche 27 décembre 2009 Statut Membre Dernière intervention 17 septembre 2020
17 sept. 2020 à 15:32
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
0