Introduction : pourquoi le Date() standard ne suffit-il pas ?
L'objet intégré Date en JavaScript est un outil puissant, mais pas toujours pratique. Lors du développement d'applications complexes sur Node.js (par exemple, des planificateurs de tâches, des systèmes d'analyse ou des services financiers), les développeurs rencontrent plusieurs problèmes :
- Mutabilité : les méthodes
setMonth()modifient l'objet d'origine. - Prise en charge limitée des fuseaux horaires :
Datene fonctionne qu'avec l'heure locale et UTC. - Complexité du formatage : pas d'équivalent intégré de
strftime. - Parsing de chaînes :
new Date("2023-13-01")ne génère pas d'erreur, mais crée "2024-01-01".
Dans cet article, nous examinerons les approches avancées pour travailler avec les dates et l'heure dans Node.js, qui vous aideront à éviter ces problèmes et à écrire un code plus fiable.
1. Intl.DateTimeFormat : formatage sans dépendances externes
Le JavaScript moderne (ES6+) fournit une API d'internationalisation intégrée Intl.DateTimeFormat. C'est un outil puissant qui permet de formater les dates et l'heure pour n'importe quelle locale sans utiliser de bibliothèques tierces.
Utilisation de base
const date = new Date('2024-03-15T14:30:00Z');
// Formatage pour la locale russeconst formatterRU = new Intl.DateTimeFormat('ru-RU', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit'});
console.log(formatterRU.format(date));// "пятница, 15 марта 2024 г., 17:30"Options avancées : fuseaux horaires et temps relatif
// Formatage avec prise en compte du fuseau horaireconst formatterTZ = new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'short'});console.log(formatterTZ.format(date));// "Friday, March 15, 2024 at 10:30 AM"
// Formatage relatif (Intl.RelativeTimeFormat)const rtf = new Intl.RelativeTimeFormat('ru', { numeric: 'auto' });console.log(rtf.format(-5, 'day')); // "5 дней назад"console.log(rtf.format(2, 'month')); // "через 2 месяца"Cette approche est idéale lorsqu'il faut éviter des dépendances inutiles, mais qu'un formatage flexible pour l'interface utilisateur est nécessaire.
2. Bibliothèque date-fns : modularité et fonctionnalité
date-fns est une bibliothèque moderne construite sur les principes de la programmation fonctionnelle. Son principal avantage est la modularité : vous importez uniquement les fonctions nécessaires, ce qui réduit considérablement la taille du bundle.
Installation et exemples de base
// Installation : npm install date-fnsimport { format, addDays, subMonths, differenceInDays, isWeekend } from 'date-fns';import { ru } from 'date-fns/locale';
const today = new Date();
// Formatage avec localeconsole.log(format(today, 'dd MMMM yyyy, EEEE', { locale: ru }));// "15 марта 2024, пятница"
// Arithmétique des datesconst nextWeek = addDays(today, 7);const lastMonth = subMonths(today, 1);
// Différence entre datesconst diff = differenceInDays(nextWeek, today);console.log(diff); // 7
// Vérification du week-endconsole.log(isWeekend(today)); // true ou falseScénarios complexes : comparaison et validation
import { parse, isValid, isBefore, isAfter, startOfMonth, endOfMonth } from 'date-fns';
// Parsing sécuriséconst parsed = parse('2024-13-01', 'yyyy-MM-dd', new Date());console.log(isValid(parsed)); // false — date invalide
// Travail avec des plagesconst start = startOfMonth(new Date(2024, 2, 1)); // 1er marsconst end = endOfMonth(new Date(2024, 2, 1)); // 31 mars
const targetDate = new Date(2024, 2, 15);if (isAfter(targetDate, start) && isBefore(targetDate, end)) { console.log('La date se situe en mars 2024');}date-fns