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 :

Deux dates prennent la même valeur [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Décembre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2018
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Deux dates prennent la même valeur
    Bonjour à Toutes et à Tous,

    J'ai un souci que je ne m'explique pas... J'ai une date de début et une date de fin. La date fin étant un an plus tard moins un jour, j'utilise DateInterval. Je donne la date de début à ma date de fin et applique le DateInterval.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $dtdebut = new DateTime($_POST['datesign']); // Je récupère ma date de début via un formulaire
    $dtdebut->format('Y-m-d'); // Je formate ma date
    $dtfin=$dtdebut; // Ma date de fin est égale à la date du début
    $dtfin->add(new DateInterval('P364D')); // J'ajoute 364 jours à ma date de fin
    $dtfin->format('Y-m-d'); // Je formate ma date de fin
    Aucun souci, aucune erreur.

    Sauf que ma date de début prend la valeur de ma date de fin... Si je prends la date d'aujourd'hui la date de début et de fin auront comme valeur le 28/02/2020...

    En revanche, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $dtdebut = new DateTime($_POST['datesign']); // Je récupère ma date de début via un formulaire
    $dtdebut->format('Y-m-d'); // Je formate ma date
    $dtfin=$dtdebut; // Ma date de fin est égale à la date du début
    $dtfin->add(new DateInterval('P364D')); // J'ajoute 364 jours à ma date de fin
    $dtfin->format('Y-m-d'); // Je formate ma date de fin
    $dtdebut = new DateTime($_POST['datesign']); // Je réinitialise ma date de début
    $dtdebut->format('Y-m-d'); // Je formate ma date
    Tout est OK (c'est normal). Mais pourquoi ma date de début prend la valeur de ma date de fin... Ai-je fais une bêtise aussi grosse que moi ??

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Bienvenue dans le mode merveilleux de l'objet. La version courte est que les objets travaillent par référence, ce qui veut dire que quand tu fais $dateDebut = $dateFin, tu te retrouves avec les 2 variables qui travaillent sur le même objet.
    Pour utiliser une métaphore, tu as deux alias qui pointent vers la même boite mail. Si tu envoies un mail à un des deux alias, ça arrive au même endroit.

    Pour contourner le problème, tu peux utiliser clone (pour dupliquer l'objet) ou initialiser 2 objets séparément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $dtdebut = new DateTime($_POST['datesign']); // Je récupère ma date de début via un formulaire
     
    // option 1 : on clone
    $dtfin = clone $dtdebut;
    // option 2 : on init avec la même donnée.
    $dtfin = new DateTime($_POST['datesign']); 
    // option 3 : on init à partir de la 1ere date
    $dtfin = new DateTime(); 
    $dtfin->setTimestamp($dtdebut->getTimestamp());
     
    $dtfin->add(new DateInterval('P364D')); // J'ajoute 364 jours à ma date de fin
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Décembre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2018
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup Celira pour ton aide !

    Et bravo pour ta rapidité !

    Encore merci.

  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
    Salut,

    en version beaucoup plus courte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $start = new DateTimeImmutable('2019-03-02');
    $end   = $start->modify('+1 year -1 day');  // 2020-03-01
    La version xxxImmutable t'évite toute la cuisine à base de clone.
    L'autre avantage c'est que cette approche tient compte nativement des années bissextiles alors que si tu rajoutes 364 jours, tu vas te manger un décalage de plus en plus grand sur la durée

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Mais pourquoi j'y ai pas pensé ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Décembre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2018
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup à vous deux pour les solutions.

    J'aurais appris deux méthodes, c'est super !

    Je dois avouer que les dates et moi...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/05/2017, 15h53
  2. [XL-2010] Colorier une ligne sur deux les lignes de même valeur
    Par ggvad dans le forum Excel
    Réponses: 1
    Dernier message: 17/12/2014, 16h28
  3. Réponses: 5
    Dernier message: 27/05/2010, 08h31
  4. Differencier deux dates dans un même tableau
    Par sarmerou08 dans le forum Débuter
    Réponses: 3
    Dernier message: 15/01/2010, 15h23
  5. Réponses: 2
    Dernier message: 21/09/2009, 14h20

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