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 :

Opérations sur les dates (calculs)


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut 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é
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 195
    Points : 148
    Points
    148
    Par défaut
    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)
    Par défaut
    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
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 397
    Points : 430
    Points
    430
    Par défaut
    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)
    Par défaut
    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.
    Dernière modification par Invité ; 20/07/2010 à 16h31.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 397
    Points : 430
    Points
    430
    Par défaut
    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)
    Par défaut
    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
    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
    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 ?

Discussions similaires

  1. Opérations sur les dates
    Par coyotte507 dans le forum Contribuez
    Réponses: 12
    Dernier message: 07/03/2007, 13h32
  2. Opération sur les dates
    Par alainGL dans le forum Access
    Réponses: 2
    Dernier message: 07/03/2007, 08h27
  3. Opération sur les dates
    Par obily dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 19/01/2007, 14h30
  4. opération sur les dates
    Par AMARI_SALIM dans le forum Langage
    Réponses: 14
    Dernier message: 19/07/2006, 18h05
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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