Problème de COMPARAISON ENTRE DEUX DATES [Résolu/Fermé]

Signaler
Messages postés
35
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
4 septembre 2019
-
Messages postés
35
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
4 septembre 2019
-
Bonjour à tous

Pour info, mon site est sur online et tourne sur PHP Version 5.5.9-1ubuntu4.22

Pour un site culturel qui annonce et commente des expositions, j'ai besoin d'une alerte quotidienne qui inscrive en tête de chaque article le nombre de jours restant pour pouvoir visiter l'exposition en question.

je ne suis pas un spécialiste du php, mais d'ordinaire je finis par trouver mes réponses en piochant des bouts de codes dans les forums et en travaillant par essais erreurs et corrections.
Mais ici rien à faire.

Le code retenu semble fonctionner mais me renvoie des réponses très fantaisistes.

Le voici

<?php
$DateEvenement = new DateTime('2018/02/13');
$DateNow = new DateTime();
$TempsRestant = $DateNow->diff($DateEvenement);
if($DateEvenement > $DateNow)
printf("Il reste %s jours pour voir l' exposition", $TempsRestant->d);
?>


L'ayant testé sur la date du 13 février 2018 j'étais assez satisfait de la réponse : 29 jours, sauf qu'en le testant sur d'autres dates j'ai du déchanter:
avec le 8 avril 2018 il répond 24 jours comme si il ne tenait pas compte du mois mais comptait les jours jusqu'a 31 et reprenait jusqu'au 8 .

Je pense avoir compris la faille mais je ne sais pas du tout comment y remédier



Pouvez-vous m'aider?

Merci d'avance


1 réponse

Messages postés
29163
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
7 août 2020
2 673
Bonjour,

   <?php
  
  //activation des erreurs PHP
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);
  
  function debug($var,$title=""){
    echo "<br><b>".$title."</b>";
    echo "<pre>";
    print_r($var);
    echo "</pre>";
  }
  
  $dateCible = '2018-04-08'; // ou 2018/02/13
  
  //exemple 1
  $dateNow1 = date('Y-m-d H:i:s');  
  debug($dateNow1,"dateNow1");
  
  $dateCible1 = date($dateCible);
  debug($dateCible1,"dateCible1");
  
  $nbDays1 = round(abs(strtotime($dateCible1) - strtotime($dateNow1))/86400);
  debug($nbDays1,"nbDays2");
  
  
  //exemple 2
  $dateNow2 = new DateTime();  
  debug($dateNow2,"dateNow2");
  
  $dateCible2 = new DateTime($dateCible);
  debug($dateCible2,"dateCible2");
  
  $interval = $dateNow2->diff($dateCible2);
  $nbDays2 = $interval->format('%a');
  debug($nbDays2,"nbDays2");

Messages postés
35
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
4 septembre 2019
2
Bonjour Jordane

C'est très gentil de m'avoir répondu si vite, il me reste un petit problème à régler, celui de la réponse conditionnelle. Dans mon code intitial - celui qui ne marchait pas...;) - je comparais les deux dates et n'affichais la réponse que si la date de fin d'expo était supérieure à la date de jour pour ne pas avoir de compte à rebours à l'envers ni de nb de jours négatif.

J'ai essayé ainsi en entrant volontairement une date dépassée le 5 janvier 2018 et en entrant une condition date cible supérieure à date jour mais ça ne marche pas : la réponse me dit que j'ai dix jours pour aller voir l'expo qui est terminée, alors que rien ne devrait s'afficher.

<?[/php/phpintro.php3 php]
$dateCible = '2018/01/05 '; // ou 2018/02/13  
  //exemple 1
  $dateNow1 = date('Y-m-d H:i:s');     
  $dateCible1 = date($dateCible);  
  $nbDays1 = round(abs(strtotime($dateCible1) - strtotime($dateNow1))/86400); 
if($dateCible> $DateNow)
  printf("Il reste %s jours pour voir l' [/contents/2142-l-exposition exposition]", $nbDays1);
?>


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).

Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
Jordane45


Et là je ne suis pas assez malin pour trouver ce qui ne va pas.
Alors il va me falloir encore un peu d'aide :(

Merci d'avance et très bonne soirée

Oncletom
Messages postés
29163
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
7 août 2020
2 673 >
Messages postés
35
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
4 septembre 2019

Pas une question d'être malin ou non... juste attentif.

Regarde le nom des variables et tu verras que tu as fait une petite erreur ( indice.. il manque un chiffre aux noms de tes variables dans ton if... )
Messages postés
35
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
4 septembre 2019
2
Merci pour les codes couleur, je n'avais pas remarqué l'icône.

J'ai changé ma condition par
if($dateCible1> $DateNow1)
  printf("Il reste %s jours pour voir  cette exposition", $nbDays1);


mais cela ne change rien, il me dit toujours que j'ai 10 jours pour voir l'exposition terminée

(j'ai aussi remplacé l'exposition par cette exposition, comme cela l'apostrophe n'est plus un problème)

Désolé mais je ne trouve pas. (honte à moi)
Messages postés
29163
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
7 août 2020
2 673
Déjà attention à l'écriture des variables...
Il faut respecter les majuscules / minuscules de noms des variables
Il ne faut pas non plus des espaces en trop dans le contenu de tes variables.

Pour finir... préfère TOUJOURS le format de date utilisant des tirets et non des slash.

Et sinon :
  //activation des erreurs PHP
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);
  
  function debug($var,$title=""){
    echo "<br><b>".$title."</b>";
    echo "<pre>";
    print_r($var);
    echo "</pre>";
  }
  
  $dateCible = '2018-01-05'; 
  
  //exemple 1
// Ne marche qu'avec le format  Y-m-d
  $dateNow1 = date('Y-m-d H:i:s');  
  debug($dateNow1,"dateNow1");
  
  $dateCible1 = date($dateCible);
  debug($dateCible1,"dateCible1");
  
  $nbDays1 = round(abs(strtotime($dateCible1) - strtotime($dateNow1))/86400);
  debug($nbDays1,"nbDays2");
  
  if($dateCible1 > $dateNow1) {
    printf("Il reste %s jours pour voir ' l'exposition", $nbDays1);
  }
  
  //exemple 2
  //ici $dateCible fonctionne avec le format Y/m/d ou Y-m-d
  $dateNow2 = new DateTime();  
  debug($dateNow2,"dateNow2");
  
  $dateCible2 = new DateTime($dateCible);
  debug($dateCible2,"dateCible2");
  
  $interval = $dateNow2->diff($dateCible2);
  $nbDays2 = $interval->format('%s');
  debug($nbDays2,"nbDays2");
  
  if($dateCible2 > $dateNow2) {
    printf("Il reste %s jours pour voir l'exposition", $nbDays2);
  }

?>
Messages postés
35
Date d'inscription
samedi 7 juillet 2007
Statut
Membre
Dernière intervention
4 septembre 2019
2
Super. Merci beaucoup.