Mise à jour le 18/11/2021
DateTime

DateTime




Il est quasiment impossible dans un projet PHP un peu conséquent de ne pas avoir un jour à manipuler des dates.
La difficulté d'apprentissage peut être croissante. Au début, on souhaite uniquement afficher la date du jour au format jj/mm/AAAA ; puis, on cherche à estimer le nombre de jours entre deux dates ; enfin, on cherche à parser des dates.

Et on se rend vite compte que la fonction PHP date() ne suffit pas réellement à faire ce que l'on souhaite.



En général, la classe native \DateTime suffit à résoudre les problèmes les plus communs, je vous invite à consulter cette page-ci où je donne quelques exemples d'utilisation de celle-ci.

1. Limites de la classe DateTime

Le problème de la classe native \DateTime est que certains méthodes basiques ont l'air de manquer.

Par exemple, des choses pratiques comme getYear, setDay ou encore des alias du type isoFormat (équivalent au format('Y-m-d')).



Deux solutions s'offrent donc à nous :
* la première est de surcharger la classe DateTime avec de nouvelles méthodes.
* la seconde serait d'utiliser un vendor comme Chronos/Carbon/Moment qui peut répondre à des besoins plus poussés.

1.1 Les vendor DateTime

Beaucoup de composants PHP populaires se retrouvent sur la page Github Awesome PHP(https://github.com/ziadoz/awesome-php).
Rien ne permet d'être convaincu que ces vendors sont meilleurs que d'autres, mais leur popularité fait qu'en cas de problème, plus de monde pourra aider.

Voici la liste des vendors orientés manipulation de Date à la mi-2021 :
* CalendR - A calendar management library.
* Carbon - A simple DateTime API extension.
* Chronos - A DateTime API extension supporting both mutable and immutable date/time.
* Moment.php - Moment.js inspired PHP DateTime handler with i18n support.
* Yasumi - An library to help you calculate the dates and names of holidays.

Chronos utilise un trait nommé MagicPropertyTrait qui permet d'avoir des méthodes comme getYear / getMonth / getDay. Il utilise également le trait ModifierTrait pour ajouter des méthodes comme hour/year/month/addYear/addYears...
La méthode toDateString existe également.

Moment.php fournit également des méthodes getYear / getMonth / getDay et également des méthodes comme addDays, subtractDays. On peut également faire un ->format(Moment::NO_TIME).

Ces deux vendors sont au coude à coude concernant la popularité, à la différence que Chronos est maintenu par l'équipe derrière CakePHP, un framework assez connu, on imagine donc que les développeurs ont un peu de bouteille.

Moment est compatible dès PHP5 alors que Chronos nécessite au minimum PHP 7.2.

🧙‍♂️️Chronos l'emporte selon moi.

1.2 La classe surchargeant DateTime

💡️Ne pas réinventer la roue.


Il est possible de créer une classe surchargeant la classe \DateTime et de l'utiliser à travers son projet.

Il y a deux avantages certains à faire sa propre classe :
* On ne dépend pas d'un vendor et donc de ces mises à jour ;
* Le projet n'embarque pas du code inutile, on utilise assez rarement toutes les méthodes d'un vendor ;
* Le code correspond parfaitement au besoin, et fait le nécessaire ;

Il y a par contre au moins trois inconvénients :
* On perd du temps à développer et maintenir du code technique (vs code fonctionnel/métier/business) ;
* Si le projet n'est pas open source, on ne profite pas des revues de code de la communauté ;
* Il faut que les développeurs de l'équipe apprennent à utiliser la "couche maison", c'est simple quand il s'agit dun getDay, mais cela peut être plus compliqué avec une méthode qui serait nommée "processBuffstream()" : à moins d'être omniscient, il faut forcément aller voir la mécanique interne ou faire des copiers/collers de ce qui existe déjà, ou encore (dans un monde idéal) : lire la documentation faite par le développeur.