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 :

Manipulation des dates


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut Manipulation des dates
    Bonjour,

    J'essaye de me dépatouiller pour un simple affichage de date. Il y a dans php une pléthore incroyable de fonctions pour traiter des dates, mais qui semblent fonctionner avec des paramètres de toute sortes. Certaines veulent un « timestamp », d'autres un nombre entier, et encore d'autres un objet.
    Pour le formatage, certaines considèrent le setlocale(), d'autres non.
    En fait, ma base de données me retourne des dates dans ce format : "2009-11-16 00:00:00"
    Question 1 : en quoi dois-je transformer cette date (et avec quel outil) pour qu'elle sont considérée par php comme une date ?
    Question 2 : quelle fonction dois-je utiliser pour la formater en format local, j'ai fait avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    setlocale(LC_ALL, 'fr_FR');
    setlocale(LC_NUMERIC, 'C');
    Merci.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    juste ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date = new \DateTime('2009-11-16 00:00:00');
    Pour ce qui est du formatage, tu as le DateTime::format() ou le plus complet mais plus complexe aussi MessageFormatter

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Donc je suis obligé de créer un objet pour manipuler des dates en php ? Il n'y a pas plus simple ? Dans la plupart des langages, les dates sont représentées à l'interne par un simple nombre entier. Dans l'objet il y a le time zone, je n'ai pas besoin de ça.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ben je ne vois pas trop où c'est compliqué.
    Après le DateTimeZone est totalement facultatif, tu peux très bien t'en passer, cela n'empêche en rien la fonction de retourner les données attendues. C'est une fonctionnalité supplémentaire qui te facilite la vie quand t'as besoin de jouer avec les fuseaux horaires. L'intérêt : c'est le support natif, cela t'évite le codage d'une usine à gaz.

    Tu peux très bien avoir aussi une représentation exotique du temps comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date = new \DateTime('@1306123200');  // 2011-05-23 04:00:00.000000
    Bref les fonctions de dates et de temps sont quand même vachement confortables à l'usage.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Bref les fonctions de dates et de temps sont quand même vachement confortables à l'usage.
    Bon, mais alors si je comprends bien, à chaque fois que je reçois une date d'une colonne dans un SELECT je dois la transformer en objet Date pour pouvoir travailler avec dans le code. Mais ensuite, pour stocker une date dans une table, qu'est-ce que je dois mettre dans la commande UPDATE ou INSERT ? Rien de tout ça n'est expliqué dans la doc, on n'y trouve qu'une liste de fonctions.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bah oui, il faut que tu regardes comment ton moteur de base de données attends que tu formates les dates que tu lui présentes (là tu quittes le domaine PHP pour celui de la base de données avec ses propres règles).
    Souvent, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "'".$date->format('Y-m-d')."'";
    suffit.

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    A noter que les SGDB ont aussi des fonctions pour manipuler les dates, il n'y a donc pas forcemment besoin d'utiliser PHP.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 84
    Points : 83
    Points
    83
    Par défaut
    tu peux aussi utiliser ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $intDate = date('U',$taDate);
    $taDateATonFormat('d-m-Y', $intDate);
    Sans pomme nous n'aurions jamais découvert la gravité... Sans tête Non plus.

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Alors c'est là qu'on apprécie vraiment la simplicité de ColdFusion.
    Le langage fournit une couche complétement indépendante du SGBD. Le seul soucis ce sont ses particularité dans la syntaxe SQL.
    Dans le résultat d'une requête, tous les champs de type date sont transformés automatiquement en date en format interne CF.
    Quand on soumet une requête INSERT ou UPDATE, il suffit de présenter les dates dans un format ODBC universel et le langage se charge de les traduire pour le SGBD.

    Merci.

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est quoi un format ODBC universel ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    C'est un format pour transmettre des dates à ODBC :
    https://technet.microsoft.com/en-us/...v=sql.90).aspx
    ColdFusion s'en sert même si la base de données n'est pas sous ODBC. C'est bien pratique.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut Autre problème de date
    Bonjour,
    Dur dur de travailler avec les dates en php !

    J'ai compris que pour travailler avec des dates, je dois les convertir en objet date, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date = date_create($getReleases_row['newsDate']);
    Pour les afficher les convertir en format texte, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_format($date,"d/m/Y");
    puis pour les storer dans la base de données, les reconvertir en format texte, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_format($date,"Y-m-d")
    Bon, MAIS les fonctions de date ont la fâcheuse habitude d'utiliser la date du jour par défaut, donc si j'ai un champ date qui contient NULL dans ma base de données, date_create me donnera la date d'aujourd'hui, ce qui n'est pas voulu du tout.
    J'ai bien essayé d'effacer la propriété date dans l'objet date, que ce soit avec une chaîne vide ou avec la valeur null, mais c'est toujours la date du jour qui revient.
    Alors comment je peux faire pour qu'une date nulle reste nulle ?

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Teste ta valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if ($getReleases_row['newsDate'] == NULL) {
     date_create($getReleases_row['newsDate']);
     .....
    }
    else {
       // quand il n'y a pas de date
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Oui, avec en fait != NULL, mais ce n'est franchement pas très commode.
    Et qu'est-ce qu'on fait « quand il n'y a pas de date » ?
    J'envisage plutôt de me créer mon propre objet Date.
    J'ai remarqué que la fonction date_create_from_format retourne FALSE quand la date est vide.
    Ça me permettrait d'avoir un objet null au lien d'un objet avec une date à tout prix.

    Merci.

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et qu'est-ce qu'on fait « quand il n'y a pas de date » ?
    C'est toi qui le sait ça : qu'est ce qui doit se passer dans ton programme quand il n'y a pas de date ?

    De manière globale sur l'ensemble de ce sujet c'est difficile de bien te répondre car on ne sait pas ce que tu veux faire de cette date provenant de la BDD.
    Par exemple s'il s'agit seulement de l'afficher dans un format, alors soit tu le fais directement en SQL, soit en une ligne de PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date =  empty($getReleases_row['newsDate']) ? "" : date_create($getReleases_row['newsDate'])->format('d/m/Y');
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Ce que je veux faire avec pas de date ? Mais rien justement.
    En ColdFusion, si une date est vide, toutes les fonctions qui formatent une date retournent une chaîne vide, ce qui est normal et logique
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <CFOUTPUT>
    maDate = [#dateFormat("",'dd/mm/yyyy')#]<BR>
    </CFOUTPUT>
    Produit
    maDate = []
    En php il faut absolument fournir une date, sinon ça plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo date_format(null,"Y/m/d");
    Produit
    date_format() expects parameter 1 to be DateTimeInterface, null given
    Pour s'en sortir il faut faire un test à chaque fois.
    Par exemple dans un formulaire d'édition de données sur un objet quelconque tiré de la bd, pour chaque champ qui contient une date je le remplis avec la date formatée.
    Si dans l'enregistrement la date est nulle, le champ dans le formulaire reste vide, c'est parfait.
    En PHP il va falloir que je vérifie à chaque fois.

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    ce qui est normal et logique
    Je ne trouve pas logique de récupérer une chaîne quand on demande un objet.
    Le reproche courant fait à PHP c'est au contraire d'être trop souple que trop strict.

    Comme je t'ai dis, si le but c'est seulement d'afficher une date dans un champ de formulaire avec un certain format, tu peux le faire directement dans ta requête mysql.
    Tu n'auras plus a supporter PHP.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  18. #18
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Je ne trouve pas logique de récupérer une chaîne quand on demande un objet.
    Si on admet qu'il est logique de traiter des dates à l'aide d'objets, en effet.
    Mais moi je trouve carrément superfétatoire et un peu prétentieux de traiter une date à l'aide d'objets, surtout si on considère que la propriété qui contient la date proprement dite dans l'objet n'est finalement rien qu'une une chaîne.
    Le reproche courant fait à PHP c'est au contraire d'être trop souple que trop strict.
    Bon, peut-être, mais remplacer de force une date vide par la date du jour n'est pas ce qu'on peut appeler de la souplesse.
    Comme je t'ai dis, si le but c'est seulement d'afficher une date dans un champ de formulaire
    Mais non justement, ce n'est pas l'unique but, c'était juste un exemple.

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

Discussions similaires

  1. [JDBC] manipulation des dates
    Par zais_ethael dans le forum JDBC
    Réponses: 3
    Dernier message: 11/12/2005, 19h55
  2. [JDBC] manipulation des dates/heures en Java
    Par kurkLord dans le forum JDBC
    Réponses: 6
    Dernier message: 09/08/2004, 12h49
  3. Manipulations des Dates
    Par kurtc dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/04/2004, 14h39
  4. [IB6][BCB5]Manipulation des dates.
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 09/04/2004, 15h33
  5. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 11h46

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