Trouver le premier mercredi du mois prochain

Résolu
punkcity Messages postés 28 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 11 avril 2008 - 9 avril 2008 à 23:13
punkcity Messages postés 28 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 11 avril 2008 - 11 avril 2008 à 14:23
bonjour,
Je m'amuse actuellement avec les dates et je cherche à faire un affichage de programme du dernier mercredi (exemple ajourd'hui le 9 avril 2008, le dernier mercredi est le 9 avril 2008, si on était hier le 8 avril le dernier mecredi serait le 2 avril 2008) au premier mercredi du prochain mois (le 7 mai 2008).

En gros si j'étais le lundi 7 avril 2008 j'aurai besoin de savoir combien de jour il y a entre le mercredi 2 avril au mercredi 7 mai (28 jours si je compte bien) et par exemple pour demain de savoir combien il y a de jour entre le 9 avril et toujours le 7 mai

Si quelqu'un a une idée et que j'ai été suffissament clair, car la recherche sur le net est infructueuse (pas evident avec des mots clefs comme date, mercredi, prochain...), je serai vraiment reconnaissant.

11 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 avril 2008 à 23:51
Hello,

<?php
date_default_timezone_set('Europe/Paris');
echo 'Dernier mercredi : ', strftime('%d-%m-%Y', strtotime('last wednesday'));
echo "\n";
$iStampNextMonth = mktime(0, 0, 0, date('m')+1, 1, date('Y'));
echo 'Premier mercredu du mois prochain : '.strftime('%d-%m-%Y', strtotime('first wednesday', $iStampNextMonth));
?>

par exemple.
3
punkcity Messages postés 28 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 11 avril 2008
10 avril 2008 à 10:30
Merci pour ces réponses aussi rapide.

J'ai finalement pris la solution de malalam en modifiant juste le dernier mercredi.

En gros voici ce que mon code donne :

<?php
date_default_timezone_set('Europe/Paris');

if (date('d-m-Y')==date('d-m-Y', strtotime('Wednesday'))) {
  $derniermecredi=strtotime('Wednesday');
  $prochainmercredi=strtotime('+1 week Wednesday');
}
else {
  $derniermecredi=strtotime('last Wednesday');
  $prochainmercredi=strtotime('next Wednesday');
}

$iStampNextMonth = mktime(0, 0, 0, date('m')+1, 1, date('Y'));
$mercredimoisprochain=strtotime('first wednesday', $iStampNextMonth);
?>

J'ai ajouté $derniermecredi et $prochainmercredi qui me permet de bien garder l'écart d'une semaine et de mettre la date actuelle lorsque l'on est déjà le mercredi.

En tout cas merci, ce petit $iStampNextMonth me permettra d'être moins approximatif dans l'affichage des informations.

Séb.

PS : je me suis rendu compte qu'il y avait des différences entre mon serveur local et celui de free au niveau de next, le next Thursday par exemple donne bien le 17-04-2008 sur mon local tandis que sur free cela donne le 10-04-2008. Problème de Timezone ? ou de config php ? (ou les deux d'ailleurs ?)
3
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 avril 2008 à 23:54
Salut,

Pour calculer le nombre de jours entre deux dates, PHP permet de faire ça très facilement.

Il suffit de convertir les deux dates en timestamp unix, de les soustraire, et de compter combien ça fait de jours...

Pour reprendre ton exemple, du 2 avril 2008 au 7 mai 2008 :

<?php

// Conversion en timestamps. On compte depuis minuit pour les deux.
$date_to = mktime(0,0,0,5,7,2008);
$date_from = mktime (0,0,0,4,2,2008);

// Temps écoulé
$time_elapsed = $date_to - $date_from;

// Conversion en jours...
$days_elapsed = intval(time_elapsed / 86400);

?>

Ca c'est juste pour compter les jours... Est-ce que tu as aussi besoin de déterminer la date du dernier mercredi, et celle du premier mercredi du mois prochain ? C'est vraiment pas sorcier, ça se fait en 1 ou 3 lignes, suivant qu'on change de mois ou pas...

Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 avril 2008 à 23:54
Oh pinaise, j'avais oublié strftime('last wednesday');

La honte... Je retourne me cacher...

Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
10 avril 2008 à 01:39
omg... bande de tricheurs... t'as des algos sympas sur les dates... on peut faire des maths avec des modulos... c'est beaucoup plus drole...
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
10 avril 2008 à 01:45
Ouaip... Ben justement, les modulos, c'est le premier truc qui m'est venu en tête...
Mais c'est vrai que pour la peine, si c'est intéressant d'un point de vue mathématique, c'est pas forcément ce qu'il y a de plus optimisé... Encore que... Mais c'est vrai que d'une manière générale, j'ai tendance à utiliser des fonctions natives plutôt que des algos en php, quand c'est possible...

Le truc des modulos, c'est pas grand chose, mais peu de gens y pensent pour savoir quelle date ce sera dans 15 jours si ça tombe le mois suivant... Rien que pour ça, ça mérite d'être expliqué, quand même.

Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
10 avril 2008 à 19:59
Hello,

ou de date sur le serveur de free...
chais pas. Faut tester la date courante sur le serveur de free et sur ton pc.

@Coucou => c'est peut-être de la triche, mais moi aussi je préfère utiliser les fonctions natives de php plutôt que de réécrire les algos. Tant qu'à faire :-)
Et puis j'aimle beaucoup cette syntaxe GNU, elle rend le code extrèmement facile à lire. Parce que les modulo...c'est certes rapide (à mon avis, c'est même plus rapide de les recoder en php, dans ce cas-ci), mais retourner sur ce code quelques mois plus tard sans l'avoir retoucher demanderait un petit temps d'adptation quand même. Et, déformation professionnelle sans doute : je n'ai pas ce temps-là :-(
0
punkcity Messages postés 28 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 11 avril 2008
10 avril 2008 à 23:41
Free a l'air de bien déconner effectivement.

Voici les résultats des tests en local et sur ovh :

Thursday : 10-04-2008
next Thursday : 17-04-2008
+1 week Thursday : 17-04-2008
last Thursday : 03-04-2008
-1 week Thursday : 03-04-2008
date('d-m-Y H:i:s', strtotime(date('d-m-Y H:i:s'))) : 10-04-2008 23:33:26 (test qui ne sert a rien mais bon, on va que ca bug coté free)

tandis que free donne :

Thursday : 10-04-2008
next Thursday : 10-04-2008
+1 week Thursday : 17-04-2008
last Thursday : 03-04-2008
-1 week Thursday : 03-04-2008
date('d-m-Y H:i:s', strtotime(date('d-m-Y H:i:s'))) : 29-09-2015 23:33:27

On constate donc deux problèmes. Un avec le "next" et l'autre avec le date('d-m-Y H:i:s', strtotime(date('d-m-Y H:i:s'))).
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
11 avril 2008 à 08:57
bon, je vais tenter de faire un tuto "manipulez les dates de tete", c'est appliquable en programmation, avec des calculs simples.
J'utiliserais ton probleme comme exemple.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
11 avril 2008 à 10:58
Les dates de tete

Beaucoup de gens detestent manipuler dates et nombres de tete, c'est
pourtant une chose simple, la plupart des calculs sur les dates peuvent
se faire en quelques operations courtes sur des nombres a deux ou
quatre chiffres.


Les jours, une histoire de modulos

On appellera par la suite "modulo de a et b", le reste de la
division de a par b. Ainsi, le modulo de 8 par 7 est 1. Tracez un
cercle, vous y placez B nombres : {0 1 2 3 ... b-1}, et bien si vous
placez a sur ce cercle, il sera a la meme place que a modulo b. On note
l'operation modulo "%".


Pour la suite, on s'interessera a un cercle de 7 nombres, 0 pour le lundi, et 6 pour le dimanche.


Nous avons globalement represente un "decalage" en "jours de la semaine", a travers une seule operation.


Si nous sommes un mardi, le D du mois M, quel jours seront nous le D du mois M+1 ?

Il s'agit de placer le nombre de jours du mois M sur le cercle :


28 7 * 4 | 28 % 7 029 7 * 4 + 1 | 29 % 7 130 7 * 4 + 2 | 30 % 7 231 7 * 4 + 3 | 31 % 7 3


Si le mois fait 28 jours, alors nous serons toujours un mardi, si le
mois fait 29 jours, alors nous passerons un mercredi, etc... Il faut le
voir comme un decalage. On note que pour les annees, ca donne :


365 % 7 = 1


Quel jours serons nous le D, du mois M, annee Y ?

Le premier janvier 2000 etait un samedi, on a donc une base :
calcul(D1, M1, Y1) = 5 (5 pour samedi). Le but du jeu, c'est d'exprimer
calcul(D, M, Y) en fonction de calcul(D1, M1, Y1), D1, M1, Y1, D, M et
Y. Il semble evident que prendre des donnnees numerique facilite
toujours les calculs... On prendra donc janvier 0, lundi 0, et le
premier du mois = 0.


dY = Y - Y1 // de combien d'annees on a avancedM M - M1 // on doit toujours faire en sorte que ca soit positif... en general, on prend M1 janvier
dD = D - D1 // idem, ca doit rester positif


pour les contraintes presentes ci dessus, il semble natuel de
prendre D1, M1, Y1 en debut de siecle, ca facilite grandement les
calculs...


calcul(D, M, Y) = calcul(D1, M1, Y1) + dD + (le decalage engendre par le mois dM) + (le decalage engendre par l'annee dY)


pour calculer les deux precedents decalages, il n'est plus seulement
naturel, mais il est necessaire de prendre D1, M1, Y1 en debut de
millenaire.


calcul(D, M, Y) = calcul(D1, M1, Y1) + dD + mois[dM] + dY + dY/4 -dY/100 + dY / 1000


les /4 et /1000 s'expliquent a cause des annees bisextiles. On a
aussi besoin d'un tableau mois, a 12 entrees, qui contiendrait les
decalages cummules correspondant aux mois.


Pour une annee bisextile :


indice |
mois |
nombre de jours du mois |
%7 |
cummules % 7 |

----

0,
janvier,
31,
3,
3,

----

1,
fevrier,
29,
1,
4,

----

2,
mars,
31,
3,
0,

----

3,
avril,
30,
2,
2,

----

4,
mai,
31,
3,
5,

----

5,
juin,
30,
2,
0,

----

6,
juillet,
31,
3,
3,

----

7,
aout,
31,
3,
6,

----

8,
septembre,
30,
2,
1,

----

9,
octobre,
31,
3,
4,

----

10,
novembre,
30,
2,
6,

----

11,
decembre,
31,
3,
2

Pour une annee bisextile :




indice |
mois |
nombre de jours du mois |
%7 |
cummules % 7 |

----

0,
janvier,
31,
3,
3,

----

1,
fevrier,
28,
0,
3,

----

2,
mars,
31,
3,
6,

----

3,
avril,
30,
2,
1,

----

4,
mai,
31,
3,
4,

----

5,
juin,
30,
2,
6,

----

6,
juillet,
31,
3,
2,

----

7,
aout,
31,
3,
5,

----

8,
septembre,
30,
2,
0,

----

9,
octobre,
31,
3,
3,

----

10,
novembre,
30,
2,
5,

----

11,
decembre,
31,
3,
1

en pratique, on s'arrange pour n'avoir besoin que du second tableau.



<?php

function 
isBissextile
(
$Y
){
    return 
$Y
%
4
 ===
0 
&amp;&amp; (
$Y
%
100
!==
0 
|| 
$Y
%
1000
=
0
);
}
function 
calcul
(
$D
, 
$M
, 
$Y
){
    
$Y
--; 
$D
--; 
$M
--;
    
$mois_nombre
=array(
0
,
3
,
3
,
6
,
1
,
4
,
6
,
2
,
5
,
0
,
3
,
5
);
    return (
            
3 
+ 
$D 
+ 
$mois_nombre
[
$M
] + 
$Y 
+ 
intval
(
$Y
/
4
) - 
intval
(
$Y 
/ 
100
) + 
intval
(
$Y
/
1000 
)
            + (
isBissextile
(
$Y
+
1
) &amp;&amp; 
$M 
> 
1
)
        ) %
7
;
}
echo 
calcul
(
1
,
7
, 
1988
); 
// exemple

?>

1les -1, c'est parce-qu'on ne doit pas compter les decalages
du mois en cours, ou de l'annee en cours, sauf si l'annee est
bissextile et que le mois est au delas de fevrier.

Trouver le premier mercredi d'un mois precis
<?php
function calcul2($M, $Y, $toD){
    $d=calcul(1, $M, $Y);
    if ($d < $toD){
        return $toD-$d+1;
    }else if ($d==$toD){
        return 1;
    }else{
        return $toD+8-$d;
    }
}
echo calcul2(8, 2008, 2); // mercredi, c'est le jours 2
?>
1
0
punkcity Messages postés 28 Date d'inscription vendredi 18 mars 2005 Statut Membre Dernière intervention 11 avril 2008
11 avril 2008 à 14:23
Merci coucou747 pour ce tutoriel qui je pense, pourrait bien me servir.
J'ai plus qu'a le relire deux ou trois fois et à essayer ton exemple pour assimiler le tout.

Bonne journée
0
Rejoignez-nous