Ajouter une semaine à une date

Baloo
Invité n'ayant pas de compte PHPfrance

31 août 2011, 21:48

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 août 2011, 22:53

salut,

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


@+
Il en faut peu pour être heureux ......

Baloo
Invité n'ayant pas de compte PHPfrance

01 sept. 2011, 02:02

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 sept. 2011, 08:24

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.

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

01 sept. 2011, 10:33

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.

Baloo
Invité n'ayant pas de compte PHPfrance

01 sept. 2011, 21:26

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!!!

ViPHP
ViPHP | 5462 Messages

02 sept. 2011, 00:33

oui strtotime fonctionne tres bien