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 :

Opérations sur les dates (calculs)


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Opérations sur les dates (calculs)
    Bonjour,

    Pour une application, j'ai besoin d'effectuer des opérations relativement simples sur des dates (soustraction/addiction de mois, de jours, ou d'année).

    Voici la méthode la plus simple que j'ai trouvée:

    Code PHP :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $date= "2010-07-20";
    echo 'ancienne date : '.$date.'<br />';
    $date= date("Y-m-d", strtotime($date." + 3 days + 2 months + 1 year"));
    echo 'nouvelle date : '.$date;


    Qui semble fonctionner vue la sortie :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    ancienne date : 2010-07-20
    nouvelle date : 2011-09-23


    Dans le doute, j'ai testé la gestion des années bissextiles :
    Code PHP :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Année bissextile
    $date = "2012-02-28";
    echo 'ancienne date (année bissextile) : '.$date.'<br />';
    $date = date("Y-m-d", strtotime($date." + 1 day"));
    echo 'date + 1 jour (année bissextile): '.$date.'<br />';
     
    // Année non bissextile
    $date = "2013-02-28";
    echo 'ancienne date (année non bissextile) : '.$date.'<br />';
    $date = date("Y-m-d", strtotime($date." + 1 day"));
    echo 'date + 1 jour (année non bissextile): '.$date.'<br />';


    Retourne :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ancienne date (année bissextile) : 2012-02-28
    date + 1 jour (année bissextile): 2012-02-29
    ancienne date (année non bissextile) : 2013-02-28
    date + 1 jour (année non bissextile): 2013-03-01


    Evidement, ça fonctionne puisqu'on utilise date(), mais ça me semble trop facile, est-ce vraiment fiable ?

  2. #2
    Membre habitué
    Bonjour
    Je l'utilise sur une de mes applications et avec un code similaire
    Je n'est pour le moment jamais eu de soucis
    A confirmer

  3. #3
    Invité
    Invité(e)
    Merci.

    A force de jouer avec, j'ai trouvé ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $date = "2010-11-31"; // le 31 novembre, ça n'existe pas.
    echo 'ancienne date : '.$date.'<br />';
    $date = date("Y-m-d", strtotime($date." + 1 day"));
    echo 'nouvelle date : '.$date.'<br />';


    qui me donne:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    ancienne date : 2010-11-31
    nouvelle date : 2010-12-02
    nouvelle date +1 : 2010-12-03


    Ce n'est pas vraiment grave puisque le calcul est bon. Mais c'est bizarre non ?

    La fonction date() doit vérifier que le jour est bien compris entre 00 et 31. (je viens aussi de m'apercevoir que ça fonctionne avec une date peut-être du type 2010-07-00)

    Mon script controle à plusieurs moment les dates avant de les traiter, personnellement ça ne devrait pas poser de problème. Mais je trouve ça curieux.

  4. #4
    Membre averti
    Si tu fais attention, tu n'auras jamais en entrée une date qui n'existe pas...

    Pourquoi tester ça?

    Si tu testes bien tes dates quand quelqu'un les rentre dans un formulaire...ce problème ne peut pas arriver...

    C'est comme de mettre une brique dans un mixer et s'étonner que ca ne fonctionne pas...

    Ce n'est pas le but de l'outil, donc non ça ne marche pas.

    P.S : Le fonctionnement que tu décris est expliqué sur la documentation php de la fonction date(). Donc je dis ça mais en plus ils ont prévu que quelqu'un pourrait l'utiliser comme toi. Ils sont forts...

  5. #5
    Invité
    Invité(e)
    zut j'ai édité mon message entre deux

    Comme je l'ai dit ça ne devrais pas poser de problème. Je suis juste curieux, je teste à tout va

    Edit : Effectivement c'est dans les contributions de la doc.

    Je sais que ce ne sont pas des anomalies, surtout que le comportement est bien connu (les codes proposés dans les contributions de la doc comportent souvent une partie qui se charge de gérer le nombre de jours dans chaque mois.

    Ca le fait aussi pour la soustraction de mois :
    • si je soustrait un mois à un mois de 31 jours (31 decembre - 1 mois) ça me renvoie le premier jour de ce mois (01 decembre)
    • plus gênant: si on soustrait un mois à la date 2010-03-31 ça renvoie 2010-03-03.

  6. #6
    Membre averti
    Par ailleurs, je viens de lire, que la documentation conseille d'utiliser la fonction date dans une fonction mktime, pour les calculs sur les dates, cela pour éviter des problèmes aux changements d'heures (heure d'été-heure d'hiver)

    Ca te fait un truc de plus à tester.

    Bonne continuation

  7. #7
    Invité
    Invité(e)
    Merci

    Oui, je compte utiliser mktime() comme indiqué dans la doc. Et evidemment, je vais aussi m'amuser à tout tester

    Merci pour vos réponses.

  8. #8
    Modérateur

    On obtiens le meme resultat avec mktime et avec strtotime.
    La gestion des mois est fait de manière mathématique et non en cherchant a reproduire une logique qui ne peut etre que spécifique au besoin d'un utilisateur.

    Exemple : si je retire 1 mois au 31 mars, je devrais avoir le 28 février ? alors si j'ajoute un 1 mois au 28 février je dois avoir le 31 mars ou le 28 mars ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP