[PHP] Bug étrange avec strftime (résolu)

Bug étrange avec strftime (résolu) [PHP] - PHP - Programmation

Marsh Posté le 26-04-2006 à 16:01:08    

Voilà voilà, je fais un script de gestion de calendrier. Je  me suis aperçu qu'au mois d'octobre, il y avait deux dimanches. J'ai simplifié le script pour pouvoir le montrer ici :  
 

Code :
  1. <html><head></head><body>
  2. <?php
  3. setlocale(LC_TIME,"fr" );
  4. $timestamp=mktime(0,0,0,10,1,2006);
  5. $nb_jours=date("t",$timestamp);
  6. echo ("$nb_jours <table border=1>" );
  7. for($i=0;$i<$nb_jours;$i++)
  8. {
  9.  echo ("<tr><td>".strftime("%a",$timestamp+$i*24*3600)."</td>
  10. <td>".strftime("%d",$timestamp+$i*24*3600)."</td></tr>" );
  11. }
  12. echo ("</table>" );
  13. ?>
  14. </body></html>


 
 
Voilà. un simple script qui crée un timestamp pour le 1er Octobre 2006, et qui incrémente de (24*3600) le nombre de secondes pour chaque jour...
 
En toute logique, je ne devrait donc pas avoir :  
 
ven. 27
sam. 28
dim. 29
dim. 29

lun. 30
 
Quelqu'un a une idée?


Message édité par Profil supprimé le 27-04-2006 à 08:56:06
Reply

Marsh Posté le 26-04-2006 à 16:01:08   

Reply

Marsh Posté le 26-04-2006 à 16:08:23    

utilise date() :o
c'est prévu pour ca
 
D'autre part il te manque un guillement a la fin de la ligne 7 :)

Reply

Marsh Posté le 26-04-2006 à 16:11:47    

Il y est, il est juste codé en &#034;
 
Merci pour ta réponse, mais je dois avoir des résultats localisés en français, c'est pour ça que je n'utilise pas date...

Reply

Marsh Posté le 26-04-2006 à 16:13:27    

a mon humble avis tu te fera moins chier a utiliser date() avec un switch pour la conversion FR que ta methode :/

Reply

Marsh Posté le 26-04-2006 à 16:14:03    

Je viens de tester avec la fonction date...
 
Sat 28
Sun 29
Sun 29
Mon 30
 
:/

Reply

Marsh Posté le 26-04-2006 à 16:22:48    

encore plus étrange : avec  

Code :
  1. <?php
  2. $i=1;
  3. $nb_jours=date("t",mktime(0,0,0,10,$i,2008));
  4. echo ("$nb_jours <table border=1> " );
  5. for($i=1;$i<$nb_jours+1;$i++)
  6. {
  7.  echo ("<tr><td>".strftime("%a",mktime(0,0,0,10,$i,2008))."</td>
  8.  <td>".strftime("%d",mktime(0,0,0,10,$i,2008))."</td><td>".mktime(0,0,0,10,$i,2008)."</tr>" );
  9. }
  10. echo ("</table>" );
  11. ?>


 
c'est à dire remplacer le timestamp par un mktime (qui donne le même résultat), aucun bug...

Reply

Marsh Posté le 26-04-2006 à 16:35:06    

un conseil... en prog , il est conseillé de dissocier PHP et HTML
Si tu veux absolument savoir ou es ton erreur, affiche pour chaque execution la valeur des variables et tu sauras ou ca bug ;)

Reply

Marsh Posté le 26-04-2006 à 16:46:10    

ce que j'ai fais... Il y a un décalage à partir de la 2e itération de la boucle : avec ce script :

Code :
  1. <?php
  2.  echo ("$nb_jours <table border=1> " );
  3. $timestamp=mktime(0,0,0,10,$i,2008);
  4. for($i=1;$i< (date("t",mktime(0,0,0,10,$i,2008))+1);$i++)
  5.  $timestamp_t=$timestamp+($i*24*3600);
  6.  echo ("<tr><td>".strftime("%a",mktime(0,0,0,10,$i,2008))."</td>
  7.  <td>".strftime("%d",mktime(0,0,0,10,$i,2008))."</td><td>".mktime(0,0,0,10,$i,2008)."</td>
  8.  <td>".$timestamp."</td>
  9.  <td>".(mktime(0,0,0,10,$i,2008)-$timestamp)."</td>
  10.  <td>$i</td></tr>" );
  11. }
  12. echo ("</table>" );
  13. ?>


 
 
ça me donne  
 
Jour   N° du jour      timestamp avec mktime      timestamp avec $timestamp+($i-1)*24*3600;      différence des deux
Wed   01             1222812000                       1222812000                                     0    
Thu  02              1222898400                       1222984800                                  -86400
 
On voit bien que à partir de la deuxième itération, il y a une différence entre le mktime créé et le timestamp qu'on incrémente... quand on divise la différence par 3600 on obtient... 24.


Message édité par Profil supprimé le 26-04-2006 à 16:55:12
Reply

Marsh Posté le 26-04-2006 à 16:49:41    

en ce cas regardes a quel moment la valeur de ces variables est modifié et affiche les séparément, si ca se trouve ton $timestamp+$i*24*3600 le dérange au niveau de la priorité d'execution des opération, essaye avec des parentheses.

Reply

Marsh Posté le 26-04-2006 à 16:56:49    

Une idée: ça viendrait pas du changement d'heure?
 
Car les mêmes décalages d'une heure apparaissent en mars... mais en négatif...


Message édité par Profil supprimé le 26-04-2006 à 16:58:00
Reply

Marsh Posté le 26-04-2006 à 16:56:49   

Reply

Marsh Posté le 26-04-2006 à 18:53:11    

Effectivement, ça vient bien du changement d'heure. Il faut refaire un mktime après chaque changement d'heure français...

Reply

Marsh Posté le 26-04-2006 à 20:30:57    

encore fallait-il y penser ! :sweat:

Reply

Marsh Posté le 12-08-2010 à 13:09:51    

Up

Citation :

Effectivement, ça vient bien du changement d'heure. Il faut refaire un mktime après chaque changement d'heure français...

N'ayant pas compris le "refaire un mktime" j'ai cherché une autre solution au problème. Et elle se trouve dans l'usage de la fonction strtotime, qui elle, gère le changement d'heure ! http://php.net/manual/en/function.strtotime.php
 
Exemple d'utilisation (un form envoie mois, jour, annee et un nombre de nuits à réserver à l'hôtel) :

Code :
  1. $jourResaTime = mktime(0, 0, 0, $_POST['mm'], $_POST['jj'], $_POST['aaaa']);
  2. // CALCUL AVEC STRTOTIME : GERE LES HEURES ETE / HIVER
  3. $departTime = strtotime("+".$_POST['nb_nuits']." day", $jourResaTime);
  4. $jourDepart = date('d F', $departTime);

Cela fonctionne sur les dimanches des changements d'heure, ce qui n'était pas le cas avec les autres fonctions de dates.
 
Cela pourra servir aux personnes qui arrivent sur ce vieux post ;)


Message édité par jhice le 12-08-2010 à 13:11:08
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed