Polar Code 🎭

Command Palette

Search for a command to run...

06
Pièce N°06

Module 6 -- Dates et Autres Objets Natifs : La Boîte à Outils de l'Ombre

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 :

  • window dans le navigateur
  • global dans Node.js
  • self dans 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. Retiens toISOString() pour les archives et toLocaleString() 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.