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 :

conserver qu'une partie de la date [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut conserver qu'une partie de la date
    Bonjour,

    je sais que en PHP, la manipulation des dates est complexe et justement, aucune idée de comment traiter mon problème.

    Je récupère une date au format DD/MM/YYYY H:i (les dates sont au format français), et je voudrais virer la fin pour ne garder que DD/MM/YYYY. Quelles fonctions faut-il utiliser pour faire cela ?

  2. #2
    Membre confirmé Avatar de RinaBK
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2021
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 50
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2021
    Messages : 92
    Par défaut
    Tu peux utiliser la fonction date(); ou getdate();

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 82
    Par défaut
    Tu pourrais utiliser substr($date,0,10) , ou bien explode(" ", $date)[0]

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    OK, mais apparemment, il faut fournir à ces fonctions un timestamp, donc il faut d'abord convertir la date que je récupère. Mais comment faire ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 82
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    OK, mais apparemment, il faut fournir à ces fonctions un timestamp, donc il faut d'abord convertir la date que je récupère. Mais comment faire ?
    Les fonctions substr et explode prennent une string en argument, si tu reçois tes données sous la forme "DD/MM/YYYY H:i", c'est probablement une string , n'est-ce pas le cas ?

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    En fait, zozizozu, quand j'ai écrit mon post, je n'avais pas vu ta réponse, donc la question était pour RinaBK.

    Tes 2 propositions fonctionnent mais je préfère l'explode au cas où la longueur de la string ne soit pas 10 mais 9 (au cas où les nombres 1 à 9 pour le jour soient sur un seul caractère et pas 2).

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 011
    Par défaut
    je sais que en PHP, la manipulation des dates est complexe
    C'est vrai et faux. Si tu t'acharnes avec les fonctions date() et autres relatives au temps, effectivement t'a pas fini de galérer (et encore plus si tu pars sur du bricolage à base de manipulation de chaînes).

    Par contre dés lors que tu mets tout ça de coté, et que tu ne t'intéresses qu'aux extensions (les classes) prévues à cet effet (et incluses de base dans PHP), là c'est beaucoup plus simple: tu sais ce que tu manipules (une date, un intervalle, une durée...) et les méthodes disponibles pour chacune d'elles. Franchement tu as tout intérêt à brader les fonctions contre les classes pour ce qui est du temps et des dates (seul point noir, la traduction des jours et mois en français, mais ça rien ne t'empêche de le faire après coup).

    Pour ce qui est de conserver la partie d'une date, c'est simple, que ce soient les fonctions de base ou les classes, tu trouveras une fonction ou une méthode de formatage dans le manuel PHP pour le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $date = new DateTime();
    echo $date->format('d-m-Y'), PHP_EOL,
         $date->format('d-m'), PHP_EOL,
         $date->format('m'), PHP_EOL,
         $date->format('Y');

  8. #8
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    En effet, la solution que me proposait zozizozu, c'était du bricolage à base de manipulation de string, mais là, c'est propre et clair (et facile) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $submit_date = new DateTime();
    $this->submit_date = $submit_date->format('d/m/Y'); //pour virer partie horaire du time
    $last_resolved_date  = new DateTime();
    $this->last_resolved_date = $last_resolved_date->format('d/m/Y');

  9. #9
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Si tu récupères une chaine dans un certains format je te conseil de créer ton datetime ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $date = DateTime::createFromFormat('d/m/Y H:i', '22/01/2020 10:30');
    echo $date->format('d/m/y'); // 22/01/20
    Au moins il n'ya pas d'ambiguité possible sur le format de création , ca me semble important qu'on travail avec un firmat non standard
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 011
    Par défaut
    [EDITH]Ah bah c'est malin ça![/EDITH]

    Et en partant de la date qui t'es donnée au départ, tu peux créer ton objet DateTime directement à partir de la méthode static DateTime::createFromFormat():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $maDate = DateTime::createFromFormat('d/m/Y H:i', '14/07/1994 17:34');
    echo $maDate->format('d/m/Y');

  11. #11
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Merci pour vos interventions grunk et Cosmo.

    Cosmo, je ne vois ce que tu apportes car tu sembles répéter ce qu'a dit grunk ...Je me trompe ? Ou alors, vu les horaires de vos 2 posts, tu n'avais pas encore vu celui de grunk .

    En fait, cette date fait partie d'une série de données que je récupère et avant de les enregistrer en bdd, je les valide. Et pour les dates :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private function validateDate($date,$the_format='d/m/Y')
        {
            $d=DateTime::createFromFormat($the_format,$date);
            if ($d== false) return false;
            $format2 = $d->format($the_format);
            return $d!==false && $format2===$date;
        }
    Etant donné ça, je n'ai besoin de modifier le code actuel, non ?

  12. #12
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    On à du poster en même temps avec Cosmo d'où nos deux réponses identiques.

    Etant donné ça, je n'ai besoin de modifier le code actuel, non ?
    Ta fonction me semble étrange :

    Tu créer un datetime avec une date et un format => pas de pb
    Tu demande à formater ce datetime avec le format qui à servi a sa création => aucun intérêt
    Tu vérifie que le résultat de ce formatage est égale à ta date d'entrée => Ca sera toujours vrai
    Le double test sur la valeur de $d est également inutile.

    Pour que ta fonction est de l'intérêt il faudrait que le format de date de création du datetime ne soit pas le même que celui du formatage demandé.

    Note également qu'un Datetime peut générer une exception qui devrait donc être catchée
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Après avoir passé du temps à réfléchir, je conçois que la fonction n'a pas de sens.
    Voici la fonction de validation qui, j'espère, a plus de sens :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function validateDate($date,$the_format='d/m/Y')
    {
        $d=DateTime::createFromFormat($the_format,$date);
     
        return $d;
     
    }

    Je n'ai pas mis, comme toi le format d/m/Y H:i, car le format attendu est d/m/Y.

  14. #14
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Il faut différencier 2 cas :

    Soit tu veux vérifier qu'une date respecte un format défini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function isValid(string $date, string $format = 'Y-m-d'): bool
    {
        try {
    		$d = DateTime::createFromFormat($format, $date);
    		return $d && $d->format($format) === $date;
    	} catch(Exception $e) {
    		return false;
    	}
    }
    Auquel cas on essai de transformer la chaine en datetime et on vérifie qu'en la formattant elle est égale à elle même (plus ou moins ce que tu faisais)

    Soit tu veux forcer un format de sortie à partir d'un format d'entrée (ta demande initiale) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function convertDate(string $date, string $informat = 'd/m/Y H:i', string $outFormat = 'd/m/Y'): ?string
    {
        try {
    		$d = DateTime::createFromFormat($informat, $date);
    		if($d) {
    			return $d->format($outFormat);
    		}
    	} catch(Exception $e) {
    		// Faire quelque chose avec l'exception
    	}
    	return null;
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    DateTime::createFromFormat ne renvoie pas une exception mai simplement false si le format ne correspond pas ( https://www.php.net/manual/fr/dateti...fromformat.php ) donc le try/catch pas utile ici, on peut se limiter à return DateTime::createFromFormat($format, $date); dans la fonction

  16. #16
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    En effet j'étais resté sur l'instanciation d'un datetime
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [MySQL] requete SQL sur une partie d'un date
    Par stefano dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/09/2012, 14h40
  2. Requête sur une partie de la date
    Par Wise_Sherkaan dans le forum SQL
    Réponses: 7
    Dernier message: 13/01/2011, 17h40
  3. Filtre sur une partie de la date
    Par souminet dans le forum Débuter
    Réponses: 1
    Dernier message: 12/05/2008, 11h31
  4. Réponses: 1
    Dernier message: 14/05/2006, 20h52
  5. Problème de contrainte sur une partie de date (l'année)
    Par shefla dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/04/2006, 22h50

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