IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Gérer l'affichage d'une date vers un format plus "confortable" visuellement


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut Gérer l'affichage d'une date vers un format plus "confortable" visuellement
    Bonjour,

    Je reviens encore avec un problème de gestion de date

    Je suis en train d'écrire une petite portion de code pour gérer l'affichage d'une date vers un format plus "confortable" visuellement.
    Quelques exemples d'affichages :
    • Aujourd'hui à 15h25 (il me manque l'heure dans mon code)
    • Hier à 03h07 (il me manque l'heure dans mon code)
    • Il y a 2 jours (forcement avec un 's' à la fin)
    • Il y a 1 an (s si plusieurs années)
    • Il y a 3 minutes (inutile de préciser les secondes)
    • Il y a 34 secondes
    • Il y a 2 heures (inutile de préciser les minutes)
    • Il y a 2 mois (inutile de préciser les jours)


    J'ai commencé à écrire une portion de code mais j'ai un problème avec "aujourd'hui" et "hier" Je n'ai jamais le bon if qui s'affiche..
    exemple pour le 2016-02-23 23:30:49 j'ai le if Aujourd'hui qui s'affiche alors que normalement c'est hier le 23/02..

    autre question, comment rajouter l'heure à "aujourd'hui" et "hier" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?php
     
    $diff = (new \DateTime())->diff(new \DateTime('2016-02-23 23:30:49'));
     
    if ($diff->d == 0){
    	$date_formatee = "aujourd'hui";
    }else{
     
    	if ($diff->d == 1){
    		$date_formatee = "hier";
    	}else{
     
    		if ($diff->y){
    			$date_formatee = $diff->y.' an'.(($diff->y > 1) ? 's' : '');
    		}else{
     
    			if ($diff->m){
    				$date_formatee = $diff->m.' mois';
    			}else{
     
    				if ($diff->d){
    					$date_formatee = $diff->d.' jours';
    				}else{
     
    					if ($diff->h){
    						$date_formatee = $diff->h.' heure'.(($diff->h > 1) ? 's' : '');
    					}else{
     
    						if ($diff->i){
    							$date_formatee = $diff->i.' minute'.(($diff->i > 1) ? 's' : '');
    						}else{
     
    							if ($diff->s){
    								$date_formatee = $diff->s.' seconde'.(($diff->s > 1) ? 's' : '');
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    }
     
    echo $date_formatee;
     
    ?>
    Je vous remercie pour votre aide

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    bon va falloir que tu en parles à ton professeur (ABCIWEB) de tes problèmes
    Tiens une soluce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $past = new \DateTime('2016-02-23 23:30:49');
    $diff = (new \DateTime())->diff($past);
     
    if ($diff->d === 0)
        // ici le "aujourd'hui" prend le pas sur les formats "il y a 3 heures" ou "il y a 34 secondes"
        echo "aujourd'hui à ", $past->format('H'), 'h', $past->format('i');
    elseif ($diff->d === 1)
        echo 'hier à ', $past->format('H'), 'h', $past->format('i');
    else
    {
        $txt = '';
     
        if ($diff->y)
            $txt = $diff->y.' an'.(($diff->y > 1) ? 's' : '');
        elseif ($diff->m)
            $txt = $diff->m.' mois';
        elseif ($diff->d)
            $txt = $diff->d.' jour'.(($diff->d > 1) ? 's' : '');
     
        echo 'Il y a ', $txt;
    }
    Tu peux compléter en rajoutant les formats "Aujourd'hui, il y a 3 heures" ou "Aujourd'hui, il y a 34 secondes"

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Par défaut
    C'est plus subtil que ça. $diff->d vaut 0 si l'écart fait moins de 86400 secondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <?php
     
    $past = new \DateTime('2016-02-23 23:30:49');
    $diff = (new \DateTime('2016-02-22 23:30:48'))->diff($past);
     
    if ($diff->d === 0)
    // ici le "aujourd'hui" prend le pas sur les formats "il y a 3 heures" ou "il y a 34 secondes"
    echo "<br>aujourd'hui à ", $past->format('H'), 'h', $past->format('i');
    elseif ($diff->d === 1)
    echo '<br>hier à ', $past->format('H'), 'h', $past->format('i');
     
    echo "<br>2 secondes de plus et ca buggue. Le 22 n'est pas le meme jour que le 23 donc on devrait avoir hier";
    $past = new \DateTime('2016-02-23 23:30:49');
    // j'ajoute 2 secondes
    $diff = (new \DateTime('2016-02-22 23:30:50'))->diff($past);
     
    if ($diff->d === 0)
    // ici le "aujourd'hui" prend le pas sur les formats "il y a 3 heures" ou "il y a 34 secondes"
    echo "<br>aujourd'hui à ", $past->format('H'), 'h', $past->format('i');
    elseif ($diff->d === 1)
    echo '<br>hier à ', $past->format('H'), 'h', $past->format('i');

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    @scvo.0ne
    Bien vu, effectivement, il y a nécessité de corriger un chouïa la fonction pour tenir compte de ce problème.

    Je vois un ajustement de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ($diff->d === 0)
        echo ($now->format('%d') === $past->format('%d')) ? "aujourd'hui à " : 'hier à ', $past->format('H'), 'h', $past->format('i');

  5. #5
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    Salut

    toujours des problèmes d'affichages

    Résultat à l'écran pour une date du 2016-02-23 23:30:49 avec le code de scvo.0ne
    hier à 23h30
    2 secondes de plus et ca buggue. Le 22 n'est pas le meme jour que le 23 donc on devrait avoir hier
    aujourd'hui à 23h30
    C'est ni hier et ni aujourd'hui car il est 00h35 (jeudi) au moment ou j'écris. donc normalement c'est "il y a 2 jours"




    Résultat à l'écran pour la même date donc 2016-02-23 23:30:49 avec le code de rawsrc
    Il y a 1 jour
    donc faux car la vraie réponse c'est "il y a 2 jours" du 23 au 25 il y a deux jours.

    ET si je modifie cette fois la date, je met le 24 (donc hier au moment ou j'écris) il m'affiche 2 erreurs :

    Notice: Undefined variable: now in C:\wamp\www\pag\test2.php on line 9
    Fatal error: Call to a member function format() on a non-object in C:\wamp\www\pag\test2.php on line 9
    LA LIGNE 9 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ($now->format('%d') === $past->format('%d')) ? "aujourd'hui à " : 'hier à ', $past->format('H'), 'h', $past->format('i');

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    bon va falloir que tu en parles à ton professeur (ABCIWEB) de tes problèmes
    Je vois qu'on se moque... c'est pas joli joli ça. D'autant que les "verbeux" ne sont peut-être pas toujours inutiles pour commenter tes ruses de sioux

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Elle est un peu bancale ta cuisine.
    Fais au plus simple, si le nombre d'heures est inférieur à 24 h, compte en heures "Il y a x heures" et ceci quelque soit la date calendaire même si entre temps t'as changé de jour.
    Savoir que c'était hier ou il y a 3 heures, ça ne devrait pas changer trop la face du monde.

    Et si après tu veux persister sans t'embarquer dans une usine à gaz de conditions, tu peux très bien aussi afficher l'horodatage passé et à coté le "Il y x ce_que_tu_veux"

  8. #8
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Elle est un peu bancale ta cuisine.
    Fais au plus simple, si le nombre d'heures est inférieur à 24 h, compte en heures "Il y a x heures" et ceci quelque soit la date calendaire même si entre temps t'as changé de jour
    Oui car avec "aujourd'hui à 12h15" et "Il y a x heures" c'est deux conditions identiques.. Donc je vais retirer la condition aujourd'hui je pense et garder les heures (plus simple). Bon je bricole et je reviens vous voir les amis

  9. #9
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    bon j'y arrive définitivement pas ! il y a toujours un problème, je suis dessus depuis des heures

    J'ai bricolé le code de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $past = new \DateTime('2016-02-23 23:19:49');
    $diff = (new \DateTime())->diff($past);
     
    if ($diff->d === 1)
        echo 'hier à ', $past->format('H'), 'h', $past->format('i');
    else
    {
        $txt = '';
     
        if ($diff->y)
            $txt = $diff->y.' an'.(($diff->y > 1) ? 's' : '');
        elseif ($diff->m)
            $txt = $diff->m.' mois';
        elseif ($diff->d)
            $txt = $diff->d.' jours'; // toujours plus grand que 2 jours sinon j'affiche hier donc condition du S inutile.
        elseif ($diff->h)
            $txt = $diff->h.' heure'.(($diff->h > 1) ? 's' : '');
        elseif ($diff->i)
            $txt = $diff->i.' minute'.(($diff->i > 1) ? 's' : '');
        elseif ($diff->s)
            $txt = $diff->s.' seconde'.(($diff->s > 1) ? 's' : '');
     
        echo 'Il y a ', $txt;
    }
    Le problème maintenant c'est que pour 2016-02-23 23:19:49 il m'affiche hier à 23h19

    Je veux bien retirer la condition "aujourd'hui" sur la suggestion de rawsrc mais "hier" je ne peux pas l'enlever car "Il y a 1 jour" c'est pas top

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage d'une date au bon format
    Par tomy29 dans le forum Struts 1
    Réponses: 9
    Dernier message: 30/10/2008, 17h50
  2. affichage d'une date depuis mysql
    Par kitty2006 dans le forum Requêtes
    Réponses: 7
    Dernier message: 22/08/2006, 17h56
  3. Affichage d'une date dans x jours
    Par Paulux1 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/07/2006, 16h49
  4. [VB6] mauvaise affichage d'une date
    Par robert_trudel dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 11/06/2006, 18h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo