Vue : construire une application web (école d'ingénieur) · Chapitre 4 · Exercice de TD
Date de retrait
Formulaires · niveau 3 (difficile)
Énoncé
Un champ type="date" permet de choisir le jour de retrait, au plus tôt le lendemain. Quel est le type de la donnée reliée ? Afficher la date choisie en toutes lettres (« jeudi 15 octobre »). Attention au fuseau horaire : pourquoi new Date("2026-10-15") est-il un mauvais point de départ ?
Corrigé
<div id="app">
<div>
<p><label>Date de retrait <input v-model="date" type="date" :min="demain"></label></p>
<p>{{ JSON.stringify(date) }} ({{ typeof date }}) — {{ date ? lisible(date) : "aucune date" }}</p>
</div>
</div>
const { createApp, ref } = Vue;
function isoLocal(d) {
const deux = (n) => String(n).padStart(2, "0");
return `${d.getFullYear()}-${deux(d.getMonth() + 1)}-${deux(d.getDate())}`;
}
createApp({
setup() {
const aujourdhui = new Date();
const demain = isoLocal(new Date(aujourdhui.getFullYear(), aujourdhui.getMonth(), aujourdhui.getDate() + 1));
const date = ref("");
function lisible(iso) {
return new Date(`${iso}T12:00`).toLocaleDateString("fr-FR", { weekday: "long", day: "numeric", month: "long" });
}
return { date, demain, lisible };
},
}).mount("#app");
Avant et après le choix du 15 octobre 2026 :
"" (string) — aucune date
"2026-10-15" (string) — jeudi 15 octobre
La donnée est une chaîne au format ISO (AAAA-MM-JJ), vide tant que rien n'est choisi, et c'est aussi ce qu'attend l'attribut min. new Date("2026-10-15") interprète une date seule comme minuit en temps universel : à Montréal, c'est encore le 14 octobre, et l'affichage serait faux d'un jour. On ajoute une heure locale (T12:00), et l'on construit le lendemain à partir des composantes locales.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.