laravel 5 : les dates

Elliott Chiaradia | 08-03-2016

Travailler avec des dates est souvent un calvaire, car le format diffère selon le pays, et les calculs ne se font pas aussi facilement qu’avec des données de type numérique comme les int ou les double.

Laravel 5.2 ne fait pas exception à la règle, c’est pourquoi, afin de facilité le traitement de ces dates, le framework utilise Carbon, une classe héritée de celle de DateTime de PHP, celle-ci a le mérite d’être bien plus pratique.

Cependant, il existe une librairie destinée à Laravel permettant de manipuler ces dates encore plus aisément, à savoir « date » de jenssegers. C’est à l’aide de celle-ci, que nous allons traiter plusieurs cas dont j’ai été confronté lors de la réalisation de divers sites web.

 

Installation

Commençons par installer la librairie « date » de jenssegers. Pour cela, rendez-vous dans votre projet en ligne de commande et lancez la commande suivante :

composer require jenssegers/date

 

Puis, dirigez-vous dans le fichier « app.php » se trouvant dans le répertoire « config » et rajoutez dans les providers la ligne suivante :

...
Jenssegers\Date\DateServiceProvider::class,
...

 

Toujours dans « app.php », dans les alias, rajoutez-y cette ligne :

...
'Date' => Jenssegers\Date\Date::class,
...

 

La librairie étant maintenant installée avec succès, penchons-nous sur quelques cas pratiques.

 

Quelques cas pratiques

Afin de pouvoir manipuler correctement les dates, vos champs contenant des dates doivent être de type « timestamp ». Dans le fichier de migration, à la création de la table, il vous suffit de définir ce type de cette façon-là :

…
$table->timestamp(‘nom_du_champ’);
…

 

La traduction

Traduire une date ne sert à rien ? Détrompez-vous ! Dès que vous voudriez afficher le nom d’un jour de la semaine ou le nom d’un mois en toutes lettres, vous serez bien content que ceux-ci s’affichent correctement.

Pour obtenir la date dans la langue souhaitée, il vous suffit de faire appel à la propriété « setLocale ».

Date::setLocale('fr');

 

Bien entendu, il n’est pas optimal de définir dans chaque contrôler la langue de nos dates, c’est pourquoi, il est conseillé de modifier la variable globale « locale » se trouvant dans le fichier « config/app.php ».

'locale' => 'fr',

 

Dorénavant, toutes les dates seront traitées en français, à moins que vous définissiez une autre langue manuellement.


Calculer l'âge d'une personne

Pour calculer l’âge d’une personne, la librairie « date » nous permet d’utiliser « ->age ». Prenons l’exemple suivant, nous avons une variable $date contenant la date 16.01.2000 qui correspond à la date de naissance d’une personne.

$date = Date::createFromDate(2000, 1, 16)

 

Si je veux obtenir son âge, il me suffit d’utiliser :

$date->age;

 

Modifier une date

Grâce à la librairie « date », nous pouvons modifier une date très facilement. Si j’ai une variable $date contenant la date du jour :

$date = new Date ::now();

 

Si je veux changer l’année de cette date (en 2001), je peux faire comme ceci :

$date->year = 2001;

 

Nous pouvons bien entendu faire pareil pour les mois, les jours, les heures, etc.

$date->month = 1;
$date->day = 31;
$date->hour = 12;

 

Nous pouvons aussi rajouter/supprimer du temps à une date. Si nous voulons obtenir la date du jour précédent (hier), nous pouvons utiliser la fonction sub() en y entrant en paramètre « 1 day » afin de d’enlever une journée à la date concernée.

$date->sub('1 day');

 

Pour rajouter du temps, nous utiliserons « add() ». Voici comment obtenir la date de demain :

$date->add('1 day');

 

Bien évidemment, ces fonctions peuvent aussi être utilisées avec d’autres paramètres, comme des mois, des années, des heures, etc.

$date ->add('1 month');

 

Obtenir tous les objets qui ont été créés entre deux dates.

Dans cet exemple, nous aimerions obtenir tous les products qui ont été créés durant le mois en cours. Nous allons commencer par utiliser les fonctions lastOfMonth() et firstOfMonth() de Carbon. Comme leur nom l’indique, elles permettent d’obtenir le dernier jour et le premier jour d’un mois.

$start= Date::now()->firstOfMonth();
$end= Date::now()->lastOfMonth();

 

La fonction now() permettant d’obtenir la date du jour, nous avons stocké dans $start le premier jour du mois et dans $end le dernier jour du même mois.

Il me suffit maintenant d’utiliser un whereBetween dans ma requête.

$products = PRODUCT::whereBetween('created_at', [$start, $end])->get();

 

Stocker, dans un tableau, tous les mois depuis une date donnée jusqu’au mois actuel

Prenons un petit exemple, nous voulons afficher un tableau avec nos chiffres d’affaire mensuels depuis le début de notre exercice jusqu'au mois en cours. Nous aurons donc besoin d’afficher le mois correspondant à côté de chaque CA.  Imaginons que notre exercice commence le premier janvier 2016.

$start= new Date('2016-01-01');
$end= Date::now()->lastOfMonth();

 

Nous allons utiliser une boucle for, le premier réflexe serait de faire quelque chose comme ceci.

$dates = array();
for($start; $end > $start; $start->add('1 month'))
        {
            array_push($dates, $start);
        }

 

Vous voyez l’erreur ? Effectivement, avec un tel code seule la dernière date sera stockée dans le tableau un certain nombre de fois (le nombre d'itérations). Car ne l’oublions pas, les dates sont des objets, il faut donc les manipuler en tant que tels.

Voici le code correct :

$dates = array();
for($start; $end > $start; $start->add('1 month'))
        {
            array_push($dates, new Date($start));
        }

 

Afficher la date dans la vue

Maintenant que nous savons comment manipuler aisément les dates, nous voulons les afficher dans une vue. Pour cela, il faut tout d’abord modifier le model de l'objet dont vous voulez afficher la date. Si par exemple j’aimerais afficher la date de création (champ « created_at ») de mes objets products, dans le model « Product », je dois rajouter la ligne suivante :

protected $dates = ['created_at'];

 

La variable $dates étant un tableau, je peux évidemment lui passer plusieurs champs de type timestamp.

protected $dates = ['created_at', 'updated_at'];

 

Maintenant que les models ont bel et bien leurs champs de type date définis en tant que tels, pour les afficher dans une vue il vous suffit d’utiliser « format(). Si je veux afficher la date de création de mon produit dans un style similaire à quelque chose comme ça : « 24/02/2016 », je rajoute cette ligne dans ma vue.

{!! $product->created_at->format('d/m/Y') !!}

 

Les différents caractères utilisés pour le format des dates sont disponibles dans la documentation officielle de PHP. La liste est très complète, on peut par exemple savoir si l’année est bissextile ou non avec le « L », obtenir le mois en toutes lettres avec le « F » ou encore connaître le numéro de la semaine avec le « W ».

 

Conclusion

Nous avons pu voir quelques cas pratiques de manipulation de dates, vous en conviendrez qu’avec Carbon et la librairie Date, nous pouvons dorénavant les traiter sans difficultés. Cependant, si vous faites tout de même face à un problème lié aux dates, référez-vous aux documentations listées dans les sources.

Source :