1. Pourquoi Day.js ?
Day.js est une bibliothĂšque lĂ©gĂšre de manipulation de dates â seulement 2 KB minifiĂ©e et gzippĂ©e. Elle offre une API presque identique Ă Moment.js mais sans les 300 KB de baggage.
Le problĂšme avec les dates natives
L'objet Date de JavaScript natif est réputé pour ses comportements incohérents :
mois indexés à 0, parsing ambigu, absence d'immutabilité, formatage limité. Day.js résout tous ces problÚmes
avec une API intuitive et prévisible.
// ProblĂšme natif â month 0 = janvier, 11 = dĂ©cembre
const d = new Date(2024, 0, 15); // 15 janvier 2024 â mais peu lisible
// Avec Day.js â clair et intuitif
const d = dayjs('2024-01-15'); // 15 janvier 2024 â
Day.js vs Moment.js vs date-fns
| CritĂšre | Day.js | Moment.js | date-fns |
|---|---|---|---|
| Taille (gzip) | ~2 KB | ~72 KB | ~13 KB (tree-shakable) |
| API chaĂźnable | Oui | Oui | Non (fonctions) |
| Immutable | Oui | Non (v2) | Oui |
| Plugins | Oui | Oui | Intégrés |
| CompatibilitĂ© Moment | TrĂšs proche | â | Non |
| TypeScript | Types inclus | Oui (@types) | Natif |
ImmutabilitĂ© â une propriĂ©tĂ© clĂ©
Chaque opération Day.js retourne un nouvel objet, sans modifier l'original.
const base = dayjs('2024-06-15');
const demain = base.add(1, 'day');
const hierr = base.subtract(1, 'day');
console.log(base.format()); // 2024-06-15 â inchangĂ© !
console.log(demain.format()); // 2024-06-16
console.log(hierr.format()); // 2024-06-14
2. Parsing & création
Day.js accepte de nombreux formats d'entrée pour créer des objets de date.
La fonction dayjs() est le point d'entrée principal.
Méthodes de création
// Date actuelle
const maintenant = dayjs();
// Depuis une chaĂźne ISO 8601
const iso = dayjs('2024-01-15');
const iso2 = dayjs('2024-01-15T14:30:00');
// Depuis un timestamp Unix (secondes)
const unix = dayjs.unix(1705276200);
// Depuis un objet Date natif
const native = dayjs(new Date(2024, 0, 15));
// Depuis un timestamp ms
const ms = dayjs(1705276200000);
// Depuis un objet littéral
const obj = dayjs({ year: 2024, month: 0, day: 15 }); // month: 0 = janvier
Validation avec .isValid()
dayjs('2024-01-15').isValid(); // true
dayjs('pas-une-date').isValid(); // false
dayjs('2024-13-01').isValid(); // false (mois 13)
dayjs(null).isValid(); // false
dayjs(undefined).isValid(); // true (= maintenant)
dayjs('').isValid(); // false
Accéder aux composantes
const d = dayjs('2024-06-15T14:30:45');
d.year(); // 2024
d.month(); // 5 â attention : 0-indexĂ© (0 = janv, 5 = juin)
d.date(); // 15 (jour du mois)
d.day(); // 6 (jour de la semaine, 0 = dimanche)
d.hour(); // 14
d.minute(); // 30
d.second(); // 45
d.millisecond(); // 0
d.valueOf(); // timestamp ms (1718455845000)
.month() retourne 0â11 (hĂ©ritage JavaScript). Pour afficher "Juin" utilisez
.format('MMMM') avec la locale française.
3. Formatage
La méthode .format() convertit un objet Day.js en chaßne selon un patron de tokens.
Avec la locale française, les noms de jours et de mois sont traduits automatiquement.
Exemples de formatage
const d = dayjs('2024-06-15T14:30:00');
d.format('DD/MM/YYYY'); // "15/06/2024"
d.format('DD/MM/YYYY HH:mm'); // "15/06/2024 14:30"
d.format('YYYY-MM-DD'); // "2024-06-15" (ISO)
d.format('DD MMMM YYYY'); // "15 juin 2024" (avec locale fr)
d.format('dddd D MMMM YYYY'); // "samedi 15 juin 2024"
d.format('HH:mm:ss'); // "14:30:00"
d.format('[Le] DD/MM [Ă ] HH[h]mm'); // "Le 15/06 Ă 14h30" (texte entre [])
Table des tokens
| Token | Signification | Exemple |
|---|---|---|
YYYY | Année 4 chiffres | 2024 |
YY | Année 2 chiffres | 24 |
MMMM | Mois long (locale) | juin |
MMM | Mois court (locale) | juin |
MM | Mois 2 chiffres | 06 |
M | Mois sans zéro | 6 |
DD | Jour 2 chiffres | 05 |
D | Jour sans zéro | 5 |
dddd | Jour semaine long | samedi |
ddd | Jour semaine court | sam |
HH | Heure 24h 2 chiffres | 14 |
hh | Heure 12h 2 chiffres | 02 |
mm | Minutes 2 chiffres | 30 |
ss | Secondes 2 chiffres | 00 |
A | AM / PM | PM |
x | Timestamp Unix ms | 1718455800000 |
X | Timestamp Unix s | 1718455800 |
Activer la locale française
<!-- Charger Day.js + locale fr + plugin relativeTime -->
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/locale/fr.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/relativeTime.js"></script>
<script>
dayjs.locale('fr');
dayjs.extend(window.dayjs_plugin_relativeTime);
// Maintenant :
dayjs('2024-06-15').format('dddd D MMMM YYYY');
// â "samedi 15 juin 2024"
</script>
.toISOString() et .toString()
const d = dayjs('2024-06-15');
d.toISOString(); // "2024-06-15T00:00:00.000Z"
d.toString(); // "Sat Jun 15 2024 00:00:00 GMT+0000"
d.toDate(); // objet Date natif
d.valueOf(); // 1718409600000 (timestamp ms)
[] dans le patron de format est traité littéralement et non
comme des tokens â pratique pour insĂ©rer des mots ou caractĂšres spĂ©ciaux.
4. Manipulation
Day.js offre des méthodes de manipulation fluides et chaßnables. Toutes retournent un nouvel objet Day.js (immutabilité).
.add() et .subtract()
const aujourd = dayjs('2024-06-15');
// Ajouter
aujourd.add(7, 'day'); // 22 juin 2024
aujourd.add(2, 'month'); // 15 août 2024
aujourd.add(1, 'year'); // 15 juin 2025
aujourd.add(3, 'hour'); // 15 juin 2024 03:00
// Soustraire
aujourd.subtract(1, 'week'); // 8 juin 2024
aujourd.subtract(6, 'month'); // 15 décembre 2023
// Unités disponibles
// year(s), month(s), week(s), day(s), hour(s), minute(s), second(s), millisecond(s)
.startOf() et .endOf()
const d = dayjs('2024-06-15T14:30:45');
d.startOf('year'); // 2024-01-01 00:00:00
d.startOf('month'); // 2024-06-01 00:00:00
d.startOf('week'); // 2024-06-09 00:00:00 (dimanche, semaine anglaise)
d.startOf('day'); // 2024-06-15 00:00:00
d.startOf('hour'); // 2024-06-15 14:00:00
d.endOf('month'); // 2024-06-30 23:59:59
d.endOf('year'); // 2024-12-31 23:59:59
d.endOf('day'); // 2024-06-15 23:59:59
.set() pour modifier un composant
const d = dayjs('2024-06-15');
d.set('year', 2025); // 2025-06-15
d.set('month', 11); // 2024-12-15 (0-indexé : 11 = déc)
d.set('date', 1); // 2024-06-01
d.set('hour', 9); // 2024-06-15 09:00:00
// ChaĂźner les modifications
d.set('year', 2025).set('month', 0).set('date', 1);
// â 2025-01-01
.clone() â copie explicite
const original = dayjs('2024-06-15');
const copie = original.clone();
// Les deux sont indépendants
copie.add(30, 'day').format(); // 2024-07-15
original.format(); // 2024-06-15 â inchangĂ©
Cas pratique â calculer des Ă©chĂ©ances
const commande = dayjs('2024-06-01');
const livraison = commande.add(5, 'day');
const expiration = commande.add(30, 'day');
const finMois = commande.endOf('month');
console.log('Livraison :', livraison.format('DD/MM/YYYY')); // 06/06/2024
console.log('Expire le :', expiration.format('DD/MM/YYYY')); // 01/07/2024
console.log('Fin de mois :', finMois.format('DD/MM/YYYY')); // 30/06/2024
5. Comparaison
Day.js propose plusieurs méthodes pour comparer des dates entre elles.
.isBefore() et .isAfter()
const a = dayjs('2024-01-01');
const b = dayjs('2024-06-15');
const c = dayjs('2024-06-15');
a.isBefore(b); // true
b.isAfter(a); // true
b.isSame(c); // true
// Comparer par unité (ignore les unités inférieures)
a.isBefore(b, 'year'); // false (mĂȘme annĂ©e 2024)
a.isBefore(b, 'month'); // true (jan < juin)
b.isSame(c, 'day'); // true
b.isSame(c, 'month'); // true
.diff() â diffĂ©rence entre deux dates
const debut = dayjs('2024-01-01');
const fin = dayjs('2024-06-15');
fin.diff(debut, 'day'); // 166 (jours)
fin.diff(debut, 'month'); // 5 (mois complets)
fin.diff(debut, 'year'); // 0 (moins d'un an)
fin.diff(debut, 'hour'); // 3984
// Avec décimales
fin.diff(debut, 'month', true); // 5.467...
// Date de naissance â Ăąge
const naissance = dayjs('1995-03-20');
const age = dayjs().diff(naissance, 'year');
console.log('Ăge :', age); // 29
.isValid() â vĂ©rifier une date
function validerDate(str) {
const d = dayjs(str);
if (!d.isValid()) {
console.error('Date invalide :', str);
return null;
}
return d;
}
validerDate('2024-06-15'); // objet Day.js valide
validerDate('2024-02-30'); // null (30 fév n'existe pas)
validerDate('abc'); // null
Tri d'un tableau de dates
const dates = [
'2024-06-15',
'2024-01-01',
'2024-12-31',
'2024-03-20'
];
// Trier du plus ancien au plus récent
const triees = dates.sort((a, b) =>
dayjs(a).isBefore(dayjs(b)) ? -1 : 1
);
// ['2024-01-01', '2024-03-20', '2024-06-15', '2024-12-31']
// Date la plus récente
const plusRecent = dates.reduce((max, d) =>
dayjs(d).isAfter(dayjs(max)) ? d : max
);
6. Plugins
Day.js est extensible par des plugins. Chaque plugin ajoute des fonctionnalités sans alourdir le bundle de base.
Charger les plugins via CDN
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/locale/fr.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/relativeTime.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/duration.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/isBetween.js"></script>
<script>
dayjs.locale('fr');
dayjs.extend(window.dayjs_plugin_relativeTime);
dayjs.extend(window.dayjs_plugin_duration);
dayjs.extend(window.dayjs_plugin_isBetween);
</script>
relativeTime â temps relatif
// Nécessite : dayjs.extend(window.dayjs_plugin_relativeTime)
dayjs.locale('fr'); // pour avoir les messages en français
const hier = dayjs().subtract(1, 'day');
const semaine = dayjs().subtract(7, 'day');
const futur = dayjs().add(3, 'hour');
hier.fromNow(); // "il y a un jour"
semaine.fromNow(); // "il y a 7 jours"
futur.fromNow(); // "dans 3 heures"
// .from(autreDate) â relatif Ă une autre date
const ref = dayjs('2024-01-01');
dayjs('2024-06-15').from(ref); // "dans 6 mois"
duration â durĂ©es
// Nécessite : dayjs.extend(window.dayjs_plugin_duration)
const duree = dayjs.duration(2, 'hours').add(30, 'minutes');
duree.hours(); // 2
duree.minutes(); // 30
duree.asMinutes(); // 150
duree.humanize(); // "3 heures" (avec locale fr)
isBetween â vĂ©rifier une plage
// Nécessite : dayjs.extend(window.dayjs_plugin_isBetween)
const date = dayjs('2024-06-15');
const debut = dayjs('2024-01-01');
const fin = dayjs('2024-12-31');
date.isBetween(debut, fin); // true
date.isBetween(debut, fin, 'day', '[]'); // true (inclusif)
Plugins disponibles
| Plugin | Fonctionnalité |
|---|---|
relativeTime | fromNow(), from() â temps relatif en langage naturel |
duration | dayjs.duration() â crĂ©er et manipuler des durĂ©es |
isBetween | .isBetween() â vĂ©rifier si une date est dans une plage |
customParseFormat | Parser des formats non-ISO : "15/06/2024" |
weekOfYear | .week() â numĂ©ro de semaine dans l'annĂ©e |
utc | Manipuler des dates en UTC |
timezone | Fuseaux horaires (nécessite utc) |
import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime';