Calculer la différence de jours
Résolu/Fermé
jobouille
Messages postés
286
Date d'inscription
jeudi 11 juin 2009
Statut
Membre
Dernière intervention
27 septembre 2017
-
Modifié par jobouille le 3/08/2015 à 22:01
jobouille Messages postés 286 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 27 septembre 2017 - 4 août 2015 à 23:24
jobouille Messages postés 286 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 27 septembre 2017 - 4 août 2015 à 23:24
A voir également:
- Calculer la différence de jours
- Comment calculer la moyenne sur excel - Guide
- Compte facebook suspendu 180 jours - Guide
- Difference tcp udp - Guide
- Compte instagram suspendu 180 jours - Guide
- Difference million milliard - Accueil - Technologies
2 réponses
NHenry
Messages postés
15176
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 décembre 2024
350
3 août 2015 à 22:47
3 août 2015 à 22:47
Déjà, tu peux simplifié en utilisant elseif :
Ensuite, tu peux aussi faire un tableau :
if($hours < 24) { $msg_derniereCo = "Aujourd'hui"; } elseif($hours < 48) { $msg_derniereCo = "Hier"; } elseif($hours < 72) { $msg_derniereCo = "Il y a 2 jours"; } else { $msg_derniereCo = "Trop longtemps"; }
Ensuite, tu peux aussi faire un tableau :
$Duree=array(); $Duree[]=array(24,"Aujourd'hui"); $Duree[]=array(48,"Hier"); ... Puis une boucle : $Texte=""; for($i,$i<count($Duree);$i++) if($Duree[$i][0]>$hours) $Texte=$Duree[$i][1]; if($Texte=="") $Texte="Trop longtemps";
Utilisateur anonyme
Modifié par ZeNairolf le 3/08/2015 à 23:25
Modifié par ZeNairolf le 3/08/2015 à 23:25
Déjà pour gagner une ligne, au lieu de faire ça:
La fonction time() est faite pour ça:
Et là avec le code que tu montres, tu peux comprimer encore plus:
Devient:
Car si ton système est bien foutu, normalement un membre ne peut pas écrire un message dans le futur, du coup le abs n'est pas utile car la date du message sera toujours inférieure à celle actuelle.
Mais vaut mieux faire un floor, car un round arrondi au dessus si c'est supérieur à .5, donc tu peux avoir il y a 2 jours au lieu de hier.
Donc:
Et petit conseille, enregistre les dates avec le timestamp directement et non la date, le timestamp est plus simple à utiliser. Du moins tu en fait un peu ce que tu veux car, si tu veux par exemple juste avoir le jour (Lundi, Mardi...) Tu dois convertir ta date en timestamp puis la reconvertir pour avoir le jour.
Après pour éviter tout les if il y a le switch/case ( https://www.php.net/manual/fr/control-structures.switch.php )
Il vas tester une valeur avec plusieurs résultat, et si l'un d'eux est correct, il exécute la commande associé, car si tu regardes tu utilises des multiples de 24, du coup ça revient à 1x24, 2x24.
Ce qui donne:
On peut même aller plus loin car si tu remarques la case 2, 3, 4, 5 et 6 on le même message, on obtient alors:
Enfin pour répondre à ton problème , tu peux comparer le jour, si on est le 03 ou le 04:
Et si tu veux encore plus comprimé, il y a la condition ternaire:
J'espère t'avoir aidé et appris des trucs, au final ton code peut ressembler à ça:
$now = date('Y-m-d H:i:s'); $datetime2 = strtotime($now);
La fonction time() est faite pour ça:
$datetime2 = time();
Et là avec le code que tu montres, tu peux comprimer encore plus:
$now = date('Y-m-d H:i:s'); $datetime2 = strtotime($now); $interval = abs($datetime2 - $datetime1); $hours= round($interval / 3600);
Devient:
$hours = round((time() - $datetime1)/ 3600);
Car si ton système est bien foutu, normalement un membre ne peut pas écrire un message dans le futur, du coup le abs n'est pas utile car la date du message sera toujours inférieure à celle actuelle.
Mais vaut mieux faire un floor, car un round arrondi au dessus si c'est supérieur à .5, donc tu peux avoir il y a 2 jours au lieu de hier.
Donc:
$hours = floor((time() - $datetime1)/ 3600);
Et petit conseille, enregistre les dates avec le timestamp directement et non la date, le timestamp est plus simple à utiliser. Du moins tu en fait un peu ce que tu veux car, si tu veux par exemple juste avoir le jour (Lundi, Mardi...) Tu dois convertir ta date en timestamp puis la reconvertir pour avoir le jour.
Après pour éviter tout les if il y a le switch/case ( https://www.php.net/manual/fr/control-structures.switch.php )
Il vas tester une valeur avec plusieurs résultat, et si l'un d'eux est correct, il exécute la commande associé, car si tu regardes tu utilises des multiples de 24, du coup ça revient à 1x24, 2x24.
Ce qui donne:
switch (ceil($hours/24)) { case 0: $msg_derniereCo = "Aujourd'hui"; break; case 1: $msg_derniereCo = "Hier"; break; case 2: $msg_derniereCo = "Il y a 2 jours"; break; case 3: $msg_derniereCo = "Il y a 3 jours"; break; case 4: $msg_derniereCo = "Il y a 4 jours"; break; case 5: $msg_derniereCo = "Il y a 5 jours"; break; case 6: $msg_derniereCo = "Il y a 6 jours"; break; case 7: $msg_derniereCo = "Il y a 1 semaine"; break; default: $msg_derniereCo = "Il y a plus d'une semaine !"; break; }
On peut même aller plus loin car si tu remarques la case 2, 3, 4, 5 et 6 on le même message, on obtient alors:
switch (ceil($hours/24)) { case 0: $msg_derniereCo = "Aujourd'hui"; break; case 1: $msg_derniereCo = "Hier"; break; case 2: case 3: case 4: case 5: case 6: $msg_derniereCo = "Il y a ".floor($hours/24)." jours"; break; case 7: $msg_derniereCo = "Il y a 1 semaine"; break; default: $msg_derniereCo = "Il y a plus d'une semaine !"; break; }
Enfin pour répondre à ton problème , tu peux comparer le jour, si on est le 03 ou le 04:
case 0: if (date('d') == date('d', $datetime1)) { $msg_derniereCo = "Aujourd'hui"; } else { $msg_derniereCo = "Hier"; } break;
Et si tu veux encore plus comprimé, il y a la condition ternaire:
case 0: $msg_derniereCo = (date('d') == date('d', $datetime1)) ? "Aujourd'hui" : "Hier" ; break;
J'espère t'avoir aidé et appris des trucs, au final ton code peut ressembler à ça:
$datetime1 = strtotime($donnees['derniereCo']); $hours = floor(floor((time() - $datetime1)/ 3600)/24); switch ($hours) { case 0: $msg_derniereCo = (date('d') == date('d', $datetime1)) ? "Aujourd'hui" : "Hier" ; break; case 1: $msg_derniereCo = "Hier"; break; case 2: case 3: case 4: case 5: case 6: $msg_derniereCo = "Il y a ".$hours." jours"; break; case 7: $msg_derniereCo = "Il y a 1 semaine"; break; default: $msg_derniereCo = "Il y a plus d'une semaine !"; break; }
jobouille
Messages postés
286
Date d'inscription
jeudi 11 juin 2009
Statut
Membre
Dernière intervention
27 septembre 2017
10
3 août 2015 à 23:50
3 août 2015 à 23:50
Merci beaucoup de votre réponse complète !
Cela m'a effectivement appris pas mal de chose.
Cependant le message affiché est toujours "Il y a plus d'une semaine !".
Comme s'il prenait cette valeur par défaut sans tenir compte des autres.
J'ai pourtant changer ma colonne en TIMESTAMP (et non datetime) et je n'ai pas modifié le code :
Encore merci de votre aide :D
Cela m'a effectivement appris pas mal de chose.
Cependant le message affiché est toujours "Il y a plus d'une semaine !".
Comme s'il prenait cette valeur par défaut sans tenir compte des autres.
J'ai pourtant changer ma colonne en TIMESTAMP (et non datetime) et je n'ai pas modifié le code :
$datetime1 = $donnees['derniereCo']; $hours = floor(floor((time() - $datetime1)/ 3600)/24); switch ($hours) { case 0: $msg_derniereCo = (date('d') == date('d', $datetime1)) ? "Aujourd'hui" : "Hier" ; break; case 1: $msg_derniereCo = "Hier"; break; case 2: case 3: case 4: case 5: case 6: $msg_derniereCo = "Il y a ".$hours." jours"; break; case 7: $msg_derniereCo = "Il y a 1 semaine"; break; default: $msg_derniereCo = "Il y a plus d'une semaine !"; break; }
Encore merci de votre aide :D
jobouille
Messages postés
286
Date d'inscription
jeudi 11 juin 2009
Statut
Membre
Dernière intervention
27 septembre 2017
10
3 août 2015 à 23:59
3 août 2015 à 23:59
Effectivement ça me met "Aujourd'hui" avec le premier datetime1 et "Il y a 2 jours" avec l'autre.
Comment je peux faire pour vérifier le timestamp ?
Merci
Comment je peux faire pour vérifier le timestamp ?
Merci
jobouille
Messages postés
286
Date d'inscription
jeudi 11 juin 2009
Statut
Membre
Dernière intervention
27 septembre 2017
10
4 août 2015 à 00:07
4 août 2015 à 00:07
Ça m'affiche ceci : string(19) "2015-08-04 00:01:39"
Il y a donc ce " string(19) " suivi de la date de la bdd du membre.
Il y a donc ce " string(19) " suivi de la date de la bdd du membre.
3 août 2015 à 23:05
Merci de m'avoir répondu et il est vrai que je n'avais pas pensé à "raccourcir" le code de cette manière-ci.
Cependant le problème reste le même :/
Merci
4 août 2015 à 00:16
$Duree[]=array(...,"...");
Ajoute une entrée à la fin du tableau.
Les entrées sont composées d'un autre tableau avec en premier, le nombre d'heure et en second le texte à afficher.
Ensuite la boucle va permettre de chercher l'entrée qui est la première à matcher (d'ailleurs, il y a un petit bug, voir plus bas dans mon message), si rien n'est trouvé, c'est que c'est hors tableau donc on affiche un texte par défaut.
est à remplacer par :