max — La plus grande valeur d'une date

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : max — La plus grande valeur d'une date

Re: max — La plus grande valeur d'une date

par ocre_rouge » 21 mai 2012, 08:28

Merci à toi !

Je comprends mieux la logique de fonctionnement.

Re: max — La plus grande valeur d'une date

par Ripat » 20 mai 2012, 10:54

Ce n'est pas comme ça qu'on utilise une fonction. Si tu cherches à connaître le nombre de jours dans un mois donné, par exemple février de cette année, il suffit de faire:

Code : Tout sélectionner

$nbreMaxPourCeMois = nbreJoursDuMois (2, 2012);
Il te suffira ensuite d'utiliser la variable dans la logique de ton programme. Regarde l'exemple qui suit. Un simple tableau avec tous les jours d'un mois donné:
/* Initialisation des variables et calcul du dernier jour du mois */
$jour = 0;
$tableMois = '<table><tr>';

$mois = 2;
$annee = 2011;
$joursMax = nbreJoursDuMois($mois, $annee);

/* On boucle tant qu'on n'est pas arrivé au dernier jour du mois */
 while ($jour++ < $joursMax) {

	/* Une cellule par jour */
	$tableMois .= '<td>'.$jour.'</td>';

	/* Une nouvelle ligne par semaine de 7 jours */
	if ($jour % 7 == 0) {
		$tableMois .= '</tr><tr>';
	}

}

/* Fermeture du tableau et affichage */
$tableMois .= '</tr></table>';
echo $tableMois;

Re: max — La plus grande valeur d'une date

par ocre_rouge » 20 mai 2012, 08:54

Merci beacoup.

J'avoue ne pas être actuellement capable de suivre tes conseils, mais je vais chercher.
	$m=date('m');
	$a=date('Y');
	if (isset($m,$a)) {
	function nbreJoursDuMois ($m, $a) {
        if ($m<0 || $m>12) {
			return false;
		} elseif ($m == 4 || $m == 6 || $m == 9 || $m == 11) {
                $i=30;
				return 30;
        } elseif ($m == 2) {
                if  ((($a % 4) == 0 && ($a % 100) != 0) || ($a %400) == 0) {
                        $i=29;
						return 29;
                } else {
						$i=28;
                        return 28;
						
                }
        } else {
				$i=31;
                return 31;
				
        }
	}
	}
	else {echo "ok";}
	if (isset($i)){
	echo $i;}
	else {echo "no";}

Re: max — La plus grande valeur d'une date

par Ripat » 19 mai 2012, 15:46

Tu dois passer le numéro du mois et l'année en paramètre de la fonction nbJoursDu Mois($m, $a). De plus tu devrais sortir cette fonction du while et en attribuer la valeur à une variable hors boucle. Ça évitera une évaluation de la fonction à chaque tour. C'est mieux pour les performances.

J'ai édité la fonction nbreJoursDuMois() pour qu'elle retourne FALSE si le mois est non valide:
function nbreJoursDuMois ($m, $a) {
	if ($m < 0 || $m > 12) {
		return false;
	} elseif ($m == 4 || $m == 6 || $m == 9 || $m == 11) {
		return 30;
	} elseif ($m ==2) {
		if  ((($a % 4) == 0 && ($a % 100) != 0) || ($a %400) == 0) {
			return 29;
		} else {
			return 28;
		}
	} else {
		return 31;
	}
}

Re: max — La plus grande valeur d'une date

par ocre_rouge » 19 mai 2012, 09:20

Merci à toi,

Pour le moment, le code ci-dessous génère une boucle sans fin, mais je vais continuer creuser.
		$jours=date("d");
			if (isset($jours)){
							while ($jours<=nbreJoursDuMois ($m,$a)) {
							$jours++;
							echo "<td>".$jours."</td>";
							$jours=date("d")+5;
			}
			}
		

Re: max — La plus grande valeur d'une date

par Ripat » 18 mai 2012, 10:00

J'ai exhumé deux fonctions que j'utilise pour calculer le nombre de jours d'un mois, la première, un peu lente mais moins verbeuse. La deuxième reprend la définition des années bissextiles. Cette dernière est à peu près 20 fois plus rapide. Je viens de les tester.
function nbreJoursDuMoisBourin($m, $a) {
	return date('d', mktime(0,0,0, ($m+1), 0, $a));
}

/*
 *  règles années bissextiles:
 * 		- soit divisibles par 4 mais non par 100
 * 		- soit divisibles par 400
 */

function nbreJoursDuMois ($m, $a) {
	if ($m == 4 || $m == 6 || $m == 9 || $m == 11) {
		return 30;
	} elseif ($m == 2) {
		if  ((($a % 4) == 0 && ($a % 100) != 0) || ($a %400) == 0) {
			return 29;
		} else {
			return 28;
		}
	} else {
		return 31;
	}
}

Re: max — La plus grande valeur d'une date

par ocre_rouge » 17 mai 2012, 14:44

Merci beaucoup, je vais voir ça :)

Re: max — La plus grande valeur d'une date

par moogli » 14 mai 2012, 18:24

Ou alors on réfléchis deux secondes et on imagine un truc plus simple.
Si Le numéro de mois est 1,3,5,7,8,10,12 => max = 31
Les autres 30.
Reste à traiter le cas février (numéro 2)
Si l'année est bissextile (paramètres L de la fonction fonction date 29 sinon 28

À partir de la tu a le max.
Suivant ce que tu souhaite afficher tu choisis un départ (1 pour le premier jour) et utilisé la fonction range pour avoir un tableau avec les numéros qui vont bien. Ou une boucle for si tu préfère ;)

@+

Re: max — La plus grande valeur d'une date

par ocre_rouge » 14 mai 2012, 15:51

Merci,

Pour remplir les td du tableau, à l'aide de dates dont la valeur augment par pallier de 1 et en fonction de l'état de complétion, il semble justement, que le but est que cette fonction strtotime soit de s'auto-incrémenter à mesure que se déroule la boucle while.

	<?php
	$daplus=1;
	if (isset($daplus)){
	while ($daplus<=31) {
	echo date('d', strtotime("+1 day".$daplus++));
	}
	}
	?>
autrement, la chaîne n'indique pas autre chose que le lendemain du jour d'aujourd'hui.

Je vais continuer à creuser :)

Re: max — La plus grande valeur d'une date

par xTG » 14 mai 2012, 14:53

Pourquoi l'incrémenter ? Le but étant qu'il te génère une date valide qu'il incrémente lui même.
$date = date('Y-m-d', strtotime('+1 day', $timestampDeDepart));
Ensuite tu obtiens donc une variable $date contenant la date +1 jour.
Tu peux la décomposer en année, mois et jour avec la fonction explode() en prenant le tiret comme séparateur. :)
Ainsi il incrémente la date, et toi tu as juste à vérifier qu'il change pas de mois dans ce qu'il te renvoie pour ce que tu veux faire.

Re: max — La plus grande valeur d'une date

par ocre_rouge » 14 mai 2012, 14:03

Merci pour ces précisions :)

Du coup, ceci pourrait peut être convenir :
	<?php
	$daplus=1;
	if (isset($daplus)){
	while ($daplus<=31) {
	$daplus++;
	echo date('d', strtotime("+1 day"));
	}
	}
	?>
Le problème qui se pose est que je ne sais pas transformer strtotime("+1 day") en une variable.
Impossible de l'incrémenter.

Merci encore :)

Re: max — La plus grande valeur d'une date

par xTG » 14 mai 2012, 12:38

Pour vérifier la validité d'une date on peut faire plus simple.
http://fr.php.net/manual/fr/function.checkdate.php

Et concernant le passage au jour suivant tout en restant valide tu peux utiliser :
http://fr.php.net/manual/fr/function.strtotime.php
(voir les exemples)

max — La plus grande valeur d'une date

par ocre_rouge » 14 mai 2012, 11:55

Bonjour,

Dans l'intention de m'assurer de la validité du calendrier suivant :
		$jours=date("d");
	if (isset($jours)){
			while ($jours<=5) {
			$jours++;
			echo "<td>".$jours."</td>";
			$jours=date("d")+5;
		}
		echo "</tr><tr>";
		while ($jours<=10) {
			$jours++;
			echo "<td>".$jours."</td>";
		}
		echo "</tr><tr>";
		while ($jours<=15) {
			$jours++;
			echo "<td>".$jours."</td>";
		}
		echo "</tr><tr>";
		while ($jours<=20) {
			$jours++;
			echo "<td>".$jours."</td>";
		}
		echo "</tr><tr>";
		while ($jours<=25) {
			$jours++;
			echo "<td>".$jours."</td>";
		}
		echo "</tr><tr>";
		while ($jours<=30) {
			$jours++;
			echo "<td>".$jours."</td>";
		}
	}
Il est nécessaire que le serveur ne génère pas un mois de février de 31 jours.
Il faudrait parvenir à retirer de la fonction
date("d");
le maximum de sa valeur :
echo max(array(date("d"))); //14
Pourtant, comme l'indique le commentaire, le serveur agit comme s'il n'existait plus rien après le 14 mai.
(Et demain, certainement, qu'il n'existera plus rien après le 15 mai).

Est-il possible de contourner ce problème ?

Par avance, je vous remercie :)