OK, parlons dates. Le truc que tout le monde déteste. Les fuseaux horaires qui mentent, les mois qui commencent à zéro, comme si janvier n'existait pas. Mais une fois que tu sais comment ça marche, tu peux faire disparaître le temps. Ou au moins le falsifier.
Pourquoi c'est capital ? Dans une opération, tu vas forcément :
- Trafiquer un horodatage d'alibi
- Calculer une fenêtre de tir
- Vérifier la cohérence d'un emploi du temps
- Enterrer une preuve avec une date précise
Et en prime, deux outils de l'ombre : RegExp pour fouiller dans les mots, et JSON pour faire passer des messages chiffrés.
6.1 Objet Date - Maîtriser le Temps (en Apparence)
Créer une Date : Plusieurs Entrées
// 1. MAINTENANT (le plus courant)
let maintenant = new Date();
console.log(maintenant); // "2024-03-15T22:30:00.000Z" (par exemple)
// 2. Depuis une chaîne (attention aux pièges)
let echappatoire = new Date("2024-12-25");
let autreVersion = new Date("December 25, 2024 23:59");
// 3. Avec des chiffres (année, mois, jour, heure, minute, seconde, milliseconde)
let rendezVous = new Date(2024, 6, 15, 20, 0); // 15 juillet 2024, 20h00 ⚠️
// ATTENTION : Les mois commencent à 0. 0 = janvier, 6 = juillet.
// 4. Timestamp Unix (millisecondes depuis le 1er janvier 1970 - l'époque)
let dateCachee = new Date(1678892400000);
Les Getters : Extraire la Partie Qui t'Intéresse
let moment = new Date("2024-07-15T14:30:45");
console.log(moment.getFullYear()); // 2024 (pas getYear(), c'est un piège)
console.log(moment.getMonth()); // 6 ⚠️ Juillet (0-11)
console.log(moment.getDate()); // 15 (jour du mois, 1-31)
console.log(moment.getDay()); // 1 (jour de la semaine, 0=dimanche)
// Heures
console.log(moment.getHours()); // 14 (0-23)
console.log(moment.getMinutes()); // 30
console.log(moment.getSeconds()); // 45
console.log(moment.getMilliseconds()); // 0
// Version UTC (sans le décalage local)
console.log(moment.getUTCHours()); // 12 (si on est en fuseau +2)
// Timestamp (l'adresse absolue dans le temps)
console.log(moment.getTime()); // 1678892400000 (ms depuis 1970)
Les Setters : Réécrire le Passé
let date = new Date();
// Modifier des fragments
date.setFullYear(2025);
date.setMonth(11); // Décembre
date.setDate(25); // Le 25
date.setHours(20, 30, 0); // 20h30 pile
// Astuce : JavaScript ajuste les débordements.
let dateImpossible = new Date(2024, 11, 32); // 32 décembre ?
console.log(dateImpossible); // 1er janvier 2025 ! (corrigé automatiquement)
Formater une Date pour la Présentation
let date = new Date("2024-07-15T14:30:00");
// Formats bruts
console.log(date.toString()); // "Mon Jul 15 2024 14:30:00 GMT+0200"
console.log(date.toDateString()); // "Mon Jul 15 2024" (juste la date)
console.log(date.toTimeString()); // "14:30:00 GMT+0200" (juste l'heure)
// Pour les transmissions (APIs, bases)
console.log(date.toISOString()); // "2024-07-15T12:30:00.000Z" (UTC, format propre)
console.log(date.toUTCString()); // "Mon, 15 Jul 2024 12:30:00 GMT"
// Format localisé (selon la langue du système)
console.log(date.toLocaleDateString()); // "15/07/2024" (FR)
console.log(date.toLocaleDateString('en-US')); // "7/15/2024" (US)
console.log(date.toLocaleString('fr-FR', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit'
})); // "lundi 15 juillet 2024 à 14:30"
Calculer avec les Dates
// Différence entre deux dates (en millisecondes)
let debut = new Date(2024, 0, 1); // 1er janvier
let fin = new Date(2024, 0, 15); // 15 janvier
let ecartMs = fin - debut; // 1209600000 ms (14 jours)
// Convertir en jours
let jours = ecartMs / (1000 * 60 * 60 * 24);
console.log(jours); // 14
// Ajouter/soustraire du temps (en ms)
let aujourdhui = new Date();
let demain = new Date(aujourdhui.getTime() + 24 * 60 * 60 * 1000);
// Plus malin : utiliser les setters
let date = new Date();
date.setDate(date.getDate() + 7); // + 7 jours
date.setMonth(date.getMonth() + 1); // + 1 mois
Libs Externes : Quand Date Faiblit
Pour les missions lourdes, on sort l'artillerie :
- date-fns (léger, modulaire) :
npm install date-fns - Day.js (ultra-léger) :
npm install dayjs - Luxon (moderne, puissant) :
npm install luxon
Exemple rapide avec date-fns :
// format(new Date(), 'yyyy-MM-dd') → "2024-03-15"
// addDays(new Date(), 7) → date + 7 jours
// isAfter(date1, date2) → vérifie si date1 est après date2
6.2 Autres Objets Natifs - Les Couteaux Suisses de l'Ombre
RegExp - Chercher des Motifs dans le Texte
// Deux façons de créer un motif (regex)
let motif1 = /code/; // Syntaxe littérale (courante)
let motif2 = new RegExp("code"); // Constructeur
// Flags (options de recherche)
let motif3 = /secret/i; // i = insensible à la casse
let motif4 = /tous/g; // g = global (toutes les occurences)
let motif5 = /ligne/m; // m = multi-ligne
// Exemples concrets
let transcript = "Le mot de passe est Tigre789. Répété : tigre789.";
// 1. TESTER la présence
let contientMotif = /[A-Z][a-z]+\d+/.test(transcript);
console.log(contientMotif); // true
// 2. TROUVER les correspondances
let trouvailles = transcript.match(/tigre\d+/gi);
console.log(trouvailles); // ["Tigre789", "tigre789"]
// 3. REMPLACER
let transcriptNettoye = transcript.replace(/[A-Z][a-z]+\d+/gi, "****");
console.log(transcriptNettoye); // "Le mot de passe est ****. Répété : ****."
// 4. CHERCHER une position
let position = transcript.search(/\d/);
console.log(position); // Index du premier chiffre
JSON - Le Langage des Messages Codés
JSON (JavaScript Object Notation). Le format pour échanger des données sans se faire repérer.
let profil = {
alias: "Le Corbeau",
niveau: 7,
compétences: ["infiltration", "écoute"],
base: {
ville: "Berlin",
secteur: "Est"
}
};
// 1. STRINGIFY : Objet JS → Chaîne JSON (pour transmettre)
let messageCode = JSON.stringify(profil);
console.log(messageCode);
// '{"alias":"Le Corbeau","niveau":7,"compétences":["infiltration","écoute"],"base":{"ville":"Berlin","secteur":"Est"}}'
// Avec options (pour lisibilité humaine)
let messageLisible = JSON.stringify(profil, null, 2);
console.log(messageLisible); // Indenté, plus facile à vérifier.
// 2. PARSE : Chaîne JSON → Objet JS (pour recevoir)
let messageRecu = '{"alias":"Viper","niveau":5}';
let donnees = JSON.parse(messageRecu);
console.log(donnees.alias); // "Viper"
// Piège : le JSON doit être parfait.
try {
let jsonPourri = "{alias: 'test'}"; // Guillemets manquants
JSON.parse(jsonPourri); // ❌ EXPLOSE
} catch (erreur) {
console.log("Message corrompu.", erreur.message);
}
globalThis - Le Point d'Accès Universel
Avant, c'était le chaos :
windowdans le navigateurglobaldans Node.jsselfdans les Web Workers
Maintenant (ES2020), un seul nom :
// globalThis marche PARTOUT
globalThis.configCache = "Ne pas toucher.";
// Dans le navigateur :
console.log(globalThis === window); // true
// Dans Node.js :
console.log(globalThis === global); // true
// Cas d'usage : polyfills (armes de secours)
if (!globalThis.Promise) {
// Implémentation de repli pour les vieux systèmes
globalThis.Promise = MaPromesseMaison;
}
Résumé de ce chapitre noir :
Date: Chiant mais vital. RetienstoISOString()pour les archives ettoLocaleString()pour les rapports.RegExp: Puissant pour fouiller. Commence par/motif/gi.JSON: Le pont.stringify()pour envoyer,parse()pour recevoir.globalThis: L'accès universel à l'environnement.
Ces objets sont des outils de niche. Tu ne les sors pas tous les jours. Mais quand tu en as besoin, c'est qu'il n'y a pas d'autre choix.