Page 1 sur 1

Ajouter une semaine à une date

Posté : 31 août 2011, 21:48
par Baloo
Bonjour,

J'ai un programme qui enregistre un même évènement toutes les semaines pendant une certaine durée. Par exemple un événement qui a lieu un mardi doit être enregistrer tous les mardis entre deux dates. Donc j'ai une variable de type date, et je lui ajoute 7 jours jusqu'à ce que j'arrive à la date souhaitée. J'utilise cet algorithme :


$ladate=$ladate+$repetjr*60*60*24; où $ladate est la date à laquelle je me trouve actuellement (elle est donc incrémentée régulièrement); $repetjr est le nombre de jour que je dois rajouter. Dans l'exemple que je prends, $repetjr est égal à 7 puisque j'ajoute 7 jours à chaque fois.


Cette commande est évidemment dans une boucle.


for ($i = 0; $i <= 340/$repetjr; $i++) {
$ladate=$ladate+$repetjr*60*60*24;
$date=date('Y-m-d',$ladate);
$enreg=mysql_db_query(***,"INSERT INTO **** VALUES (*****)");
}


Ce qui me répète un événement pendant environ 1 an (je n'ai pas besoin d'être précis).

Un phénomène très étrange se produit. Lorsque j'ajoute 7 jours à la date du 25/10/2011, je me retrouve avec le 31/10/2011 au lieu du 1/11/2011. Et cela pour toutes les dates qui viennent également après. Un retour à la normale se produit à partir du 25/03/2012 je crois.

Cela correspond étrangement aux heures d'été et d'hiver non? Pourquoi? Que se passe-t-il? Et comment réglé le problème!!!!

Mille mercis pour votre aide.

Re: Ajouter une semaine à une date

Posté : 31 août 2011, 22:53
par moogli
salut,

regarde du coté de la classe datetime
et plus particulièrement du coté de la méthode add


@+

Re: Ajouter une semaine à une date

Posté : 01 sept. 2011, 02:02
par Baloo
Merci mon cher Moogli.

Malheureusement, mon serveur est en php 5.0 et je ne puis pas le changer (serveur Free). Donc cette fonction n'est pas reconnue. Ou alors je l'utilise mal?

En tout cas c'est bien dommage car ça aurait été super simple, rapide, efficace aussi sans doute...

Auriez vous une autre idée??? Je viens de faire des tests, et quand j'ajoute un jour avec ma méthode au 30/10/2011, cela donne le 30/10/2011!!! Pour les jours suivants c'est bon par contre.

Merci d'avance.

Re: Ajouter une semaine à une date

Posté : 01 sept. 2011, 08:24
par moogli
Merci mon cher Moogli.
Malheureusement, mon serveur est en php 5.0 et je ne puis pas le changer (serveur Free). Donc cette fonction n'est pas reconnue. Ou alors je l'utilise mal?
(PHP 5 >= 5.3.0) :/

effectivement free est à la bourre ^^

a tu essayé l'exemple 3 de la doc de la fonction date ?
<?php
$tomorrow  = mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"));
$nextyear  = mktime(0, 0, 0, date("m"),   date("d"),   date("Y")+1);
?>
sinon tu peux voir la chose avec strtotime
avec, par exemple, $uneSemainePlusTard = strtotime('+1 week',date('U',$dateDeDepart));
et tu boucle dessus.

@+

Re: Ajouter une semaine à une date

Posté : 01 sept. 2011, 10:33
par Mazarini
Bonjour,

J'avais déjà vu ce problème sur un forum il y a pas mal de temps. Le problème est lié au passage de l'heure d'été à l'heure d'hiver. Si tu affiche tes dates avec l'heure, tu va passer du lundi à 00h au dimanche suivant à 23h.

Une solution simple est de se positionner à 12h avant de faire les calculs. Le passage de 12h à 11h n'a pas le même impact. Il faut bien entendu tronqué la date après calcul en supprimant les heures.

Autrement, il me semble que dans les fonctions d'ajout sur les dates il y a une possibilité d'ignorer la distinction heure d'été/heure d'hiver.

Re: Ajouter une semaine à une date

Posté : 01 sept. 2011, 21:26
par Baloo
Merci pour toutes ces propositions.

Je pense effectivement que l'utilisation de strtotime peut éventuellement résoudre mon problème, tant que la répétition se compte en semaine.

Et si je fais : $uneSemainePlusTard = strtotime('+$xxx days',date('U',$dateDeDepart)); est-ce que ça marchera? On passe l'heure d'été/hiver?

Je vais essayer.

Merci chers amis de la jungle!!!

Re: Ajouter une semaine à une date

Posté : 02 sept. 2011, 00:33
par stealth35
oui strtotime fonctionne tres bien