Trouver le premier mercredi du mois prochain [Résolu]

punkcity 28 Messages postés vendredi 18 mars 2005Date d'inscription 11 avril 2008 Dernière intervention - 9 avril 2008 à 23:13 - Dernière réponse : punkcity 28 Messages postés vendredi 18 mars 2005Date d'inscription 11 avril 2008 Dernière intervention
- 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.
Afficher la suite 

11 réponses

Répondre au sujet
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 9 avril 2008 à 23:51
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de malalam
punkcity 28 Messages postés vendredi 18 mars 2005Date d'inscription 11 avril 2008 Dernière intervention - 10 avril 2008 à 10:30
+3
Utile
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 ?)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de punkcity
neigedhiver 2492 Messages postés jeudi 30 novembre 2006Date d'inscription 14 janvier 2011 Dernière intervention - 9 avril 2008 à 23:54
0
Utile
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...
Commenter la réponse de neigedhiver
neigedhiver 2492 Messages postés jeudi 30 novembre 2006Date d'inscription 14 janvier 2011 Dernière intervention - 9 avril 2008 à 23:54
0
Utile
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...
Commenter la réponse de neigedhiver
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 10 avril 2008 à 01:39
0
Utile
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...
Commenter la réponse de coucou747
neigedhiver 2492 Messages postés jeudi 30 novembre 2006Date d'inscription 14 janvier 2011 Dernière intervention - 10 avril 2008 à 01:45
0
Utile
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...
Commenter la réponse de neigedhiver
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 10 avril 2008 à 19:59
0
Utile
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à :-(
Commenter la réponse de malalam
punkcity 28 Messages postés vendredi 18 mars 2005Date d'inscription 11 avril 2008 Dernière intervention - 10 avril 2008 à 23:41
0
Utile
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'))).
Commenter la réponse de punkcity
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 11 avril 2008 à 08:57
0
Utile
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.
Commenter la réponse de coucou747
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 11 avril 2008 à 10:58
0
Utile
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
Commenter la réponse de coucou747
punkcity 28 Messages postés vendredi 18 mars 2005Date d'inscription 11 avril 2008 Dernière intervention - 11 avril 2008 à 14:23
0
Utile
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
Commenter la réponse de punkcity

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.