IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Voir le flux RSS

Dendrite

PHP DateTime : exploiter une date � un mois d'intervalle...

Noter ce billet
par , 01/11/2020 � 15h03 (1189 Affichages)
Bonjour,

Avec DateTime, on se dit que c'est d'une facilit� d�concertante.
Eh bien pas tant que �a.
Car si je vous dis le 14 juillet, "Je vous livre vos courses dans un mois pile", vous m'attendrez de pied ferme le 14 ao�t.
Tandis que si je vous dis le 30 septembre, "Je vous livre vos courses dans un mois pile", vous n'aurez aucun moyen de savoir si cela veut dire "je vous les livre le 30 octobre, ou le 31 octobre"... les deux sont justes.

Pourquoi cela a-t-il sa petite importance ?

Car si vous tentez de soustraire un mois au 31/10, DateTime va soustraire 30 jours, et vous renvoyer le 1er octobre, tandis que vous attendiez le 30/09, de fa�on intuitive.
Voici donc par quel moyen contourner le probl�me, quelle que soit la date en param�tre.

Calculer la date du mois pr�c�dent

Code PHP : 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
19
20
<?php
function return_one_month_earlier($cur_day){
  $given_day= new DateTime($cur_day);
  $given_day->modify('last day of');
  $the_other_day = new DateTime($cur_day);
  if($given_day==$the_other_day){
    $the_other_day->modify('last day of -1 month');
  }
  else{
    $the_other_day->modify('-1 month');
  }
  return $the_other_day;
}
$day='2020-12-31';//retournera '2020-11-30'
$day='1789-08-14';//retournera '1789-07-14'
$day='2008-01-31';//retournera '2007-12-31'
$day='2020-03-31';//retournera '2020-02-29'
echo $day.'<br/>';
$one_month_ago = return_one_month_earlier($day);
echo $one_month_ago->format('Y-m-d');

Explications de la fonction ci-dessus

  1. Le param�tre est un cha�ne de caract�res au format "YYYY-MM-DD".
  2. On va devoir cr�er 2 objets DateTime � partir de la m�me date (au d�part).
  3. Sur le premier objet $given_day, on le transforme pour aller chercher le dernier jour du mois fourni. ('last_day_of')
  4. Si le jour saisi ($the_other_day) est le dernier jour du mois saisi alors on va chercher le dernier jour du mois pr�c�dent.
  5. Sinon alors on retire un mois
  6. On retourne l'objet DateTime





Calculer la date du mois suivant

Code PHP : 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
19
<?php
function return_one_month_later($cur_day){
  $given_day= new DateTime($cur_day);
  $given_day->modify('last day of');
  $the_other_day = new DateTime($cur_day);
  if($given_day==$the_other_day){
    $the_other_day->modify('last day of next month');
  }
  else{
    $the_other_day->modify('+1 month');
  }
  return $the_other_day;
}
 
//$day='2020-11-30';//retournera '2020-12-31'
$day='1789-07-14';//retournera '1789-08-14'
echo $day.'<br/>';
$one_month_later = return_one_month_later($day);
echo $one_month_later->format('Y-m-d');

Explications de la fonction ci-dessus

  1. Le param�tre est un cha�ne de caract�res au format "YYYY-MM-DD".
  2. On va devoir cr�er 2 objets DateTime � partir de la m�me date (au d�part).
  3. Sur le premier objet $given_day, on le transforme pour aller chercher le dernier jour du mois fourni. ('last_day_of')
  4. Si le jour saisi ($the_other_day) est le dernier jour du mois fourni alors on va chercher le dernier jour du mois suivant.
  5. Sinon on ajoute un mois
  6. On retourne l'objet DateTime

Envoyer le billet � PHP DateTime : exploiter une date � un mois d'intervalle... � dans le blog Viadeo Envoyer le billet � PHP DateTime : exploiter une date � un mois d'intervalle... � dans le blog Twitter Envoyer le billet � PHP DateTime : exploiter une date � un mois d'intervalle... � dans le blog Google Envoyer le billet � PHP DateTime : exploiter une date � un mois d'intervalle... � dans le blog Facebook Envoyer le billet � PHP DateTime : exploiter une date � un mois d'intervalle... � dans le blog Digg Envoyer le billet � PHP DateTime : exploiter une date � un mois d'intervalle... � dans le blog Delicious Envoyer le billet � PHP DateTime : exploiter une date � un mois d'intervalle... � dans le blog MySpace Envoyer le billet � PHP DateTime : exploiter une date � un mois d'intervalle... � dans le blog Yahoo

Mis � jour 01/11/2020 � 17h51 par Dendrite

Cat�gories
Sans cat�gorie

Commentaires

  1. Avatar de laurentSc
    • |
    • permalink
    Merci Dendrite pour ces 2 fonctions. Pourrais-tu rajouter des commentaires pour les expliquer car je suis loin d'�tre familier avec le type DateTime et si on essaye de lire la doc, il y a plein de trucs � lire qui ne servent � rien ici. Bref, j'ai abandonn�...
  2. Avatar de Dendrite
    • |
    • permalink
    Citation Envoy� par laurentSc
    Merci Dendrite pour ces 2 fonctions. Pourrais-tu rajouter des commentaires pour les expliquer car je suis loin d'�tre familier avec le type DateTime et si on essaye de lire la doc, il y a plein de trucs � lire qui ne servent � rien ici. Bref, j'ai abandonn�...
    Bonjour Laurent,

    J'ai ajout� mes explications, mais elles tiennent plus de la logique que de la fa�on de manipuler la classe DateTime, que je trouve moi extr�mement intuitive.
    Tu bloques sur quoi ?
  3. Avatar de laurentSc
    • |
    • permalink
    Merci pour les commentaires et je ne bloque plus.
    Je ne comprenais pas par exemple la m�thode modify. Les param�tres que tu lui passes (comme last day of -1 month, last day of next month ou +1 month), �a s'invente pas. Tu les trouve dans la doc ?
  4. Avatar de Dendrite
    • |
    • permalink
    Oh non, je n'ai rien invent� lol...
    C'est cette id�e :

    https://www.php.net/manual/fr/dateti...s.relative.php
  5. Avatar de Dendrite
    • |
    • permalink
    Ce qui surprend un peu au d�but avec les objets de classe DateTime, c'est qu'une m�thode comme modify les modifie directement par r�f�rence.
    Alors qu'on est plus habitu�s � manipuler des m�thodes qui retournent des valeurs.