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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Manipulation de dates SQL avec la classe DateTime


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 18
    Points
    18
    Par défaut Manipulation de dates SQL avec la classe DateTime
    Bonjour à tous,

    Je me lance dans ma première contribution : la possibilité d'agir sur des dates au format Sql (DATE, DATETIME, TIME, TIMESTAMP) avec la classe DateTime de PHP5.

    J'ai créé 4 classes filles de DateTime (une pour chaque type SQL) qui permettent la modification et la comparaison de dates, et qui gèrent également les valeurs nulles SQL (exemple 0000-00-00 00:00:00 qui n'est pas nativement reconnue par la classe DateTime).

    Les 4 classes ont des méthodes communes regroupées dans un Trait (compatibilité PHP 5.4 donc, mais aussi compatible PHP > 5.2 en copiant/collant dans chaque classe les méthodes du trait).
    Edit : ce n'est plus le cas, une classe abstraite a été utilisée à la place.

    Exemple d'utilisation :

    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
     
    $MaDate =   new SqlDateTime('2012-01-03 13:42:05'); 
    var_dump((string) $MaDate); // '2012-01-03 13:42:05'
     
    $MaDate ->  Modify('- 3 days'); 
    var_dump((string) $MaDate); // '2011-12-31 13:42:05'
     
    $MaDate ->  Modify('0000-00-00 00:00:00');  
    var_dump((string) $MaDate); // '0000-00-00 00:00:00'
     
    $MaDate ->  Modify('- 3 days'); 
    var_dump((string) $MaDate); // '0000-00-00 00:00:00'
     
    $MaDate ->  Modify('2013-02-06 13:50:55');  
    var_dump((string) $MaDate); // '2013-02-06 13:50:55'
     
    $MaDate ->  Modify('+ 2 hours 3 min -2 sec');   
    var_dump((string) $MaDate); // '2013-02-06 15:53:53'
    J'ai ajouté dans le trait une méthode __toString permettant de retourner l'objet en chaîne Sql, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $MaDate = new SqlDate('now'); // SqlDate correspond au type Sql "Date" : YYYY-MM-DD
    $MaDate -> Modify('-1 day');
    $MesDates = Array($Madate) // $MesDates[0] vaut (string) '2012-03-06'
    Tout le détail est ici :
    http://www.couscousboulette.com/2013...bjet-datetime/

    Il vous suffit de choper le code source, et d'utiliser les classes SqlDateTime, SqlDate, SqlTime et SqlTimeStamp à la place de DateTime quand vous travaillez avec des données venant de MySql.

    Enjoy
    Ben

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    perso je suis un grand fan de usort. si tu fournis le calback pour comparer un tableau de date et

    pourquoi un trait non compatible avec php < 5.4, alors qu'avant de mettre des trait on peut mettre de l'héritage "traditionnel des familles" et des interfaces ?

    j'aurai personnellement mis cet arbre d'héritage là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DateTime 
          + --> Abstract SqlDates
                          + --> SqlDateTime 
                          + --> SqlDate 
                          + --> SqlTime 
                          + --> SqlTimeStamp


    j'irai pas titiller sur le fait que le timezone est "en dur" et qu'il n'y a pas de constante de classe avec des valeurs magique qui pourrait être pratique...

    C'est un bon début mais elle ne connais pas assez le serveur SQL à mon gout. Par exemple j'aurais bien vu une methode dans la classe intermédiaire abtraite pour parametrer le timezone sur le serveur... (et qui prendrait un PDO en parametre... )
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    Hello gene69,

    Bien vu pour le trait, je les expérimente en ce moment, et pour le coup, étant donné que les méthodes ne seront pas applicables à une classe qui n'a rien à avoir avec DateTime, une classe abstraite a beaucoup plus sa place. Je vais la retravailler en ce sens.

    Pour le timezone, yep, j'ai mis tel quel ce que j'ai utilisé pour mon besoin spécifique, mais il ne devrait pas être en dur. Je vais retravailler ce point également...

    En revanche, si je n'ai pas compris l'intégralité de ta dernière phrase, j'ai volontairement exclu PDO de la classe puisque son travail se résume à travailler sur un format donné et non sur une classe (personnellement j'utilise aussi ce genre de formats de date en dehors d'un contexte MySQL).

    Bien à toi,
    Ben

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    Re,

    C'est désormais corrigé ; je fais appel à une classe abstraite et le Timezone est débrayable.

    Merci pour tes conseils !

Discussions similaires

  1. Date SQL avec l'heure
    Par stc074 dans le forum Langage
    Réponses: 2
    Dernier message: 17/04/2014, 18h07
  2. Manipulation des dates avec la classe Calendar
    Par mesken dans le forum Langage
    Réponses: 14
    Dernier message: 18/02/2011, 19h23
  3. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  4. Convertir une date au format excel en datetime SQL server
    Par ALLB dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 20/07/2004, 11h28

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