Faisons connaissance avec un nouvel objet intĂ©grĂ© : Date. Il stocke la date, lâheure et fournit des mĂ©thodes pour la gestion de la date et de lâheure.
Par exemple, nous pouvons lâutiliser pour enregistrer les heures de crĂ©ation / modification, pour mesurer lâheure ou simplement pour imprimer la date du jour.
Creation
Pour crĂ©er un nouvel objet Date, appelez new Date() avec lâun des arguments suivants :
new Date()-
Sans arguments â crĂ©e un objet
Datepour la date et lâheure actuelles.let now = new Date(); alert( now ); // affiche la date/heure actuelle new Date(millisecondes)-
Crée un objet
Dateavec lâheure correspondant au nombre de millisecondes (1/1000 de seconde) Ă©coulĂ©e aprĂšs le 1er janvier 1970 UTC.// 0 signifie 01.01.1970 UTC+0 let Jan01_1970 = new Date(0); alert( Jan01_1970 ); // maintenant, ajoutez 24 heures, cela devient 02.01.1970 UTC+0 let Jan02_1970 = new Date(24 * 3600 * 1000); alert( Jan02_1970 );Un nombre entier reprĂ©sentant le nombre de millisecondes Ă©coulĂ©es depuis le dĂ©but de 1970 est appelĂ© un timestamp (horodatage).
Câest une reprĂ©sentation numĂ©rique dâune date. Nous pouvons toujours crĂ©er une date Ă partir dâun horodatage Ă lâaide de
new Date(*horodatage*)et convertir lâobjetDateexistant en un horodatage Ă lâaide de la mĂ©thodedate.getTime()(voir ci-dessous).Les dates antĂ©rieures au 01.01.1970 ont des horodatages nĂ©gatifs, par exemple :
// 31 Dec 1969 let Dec31_1969 = new Date(-24 * 3600 * 1000); alert( Dec31_1969 ); new Date(datestring)-
Sâil existe un seul argument, et quâil sâagit dâune chaĂźne, il est automatiquement analysĂ©. Lâalgorithme est le mĂȘme que celui utilisĂ© par
Date.parse, nous le couvrirons plus tard.let date = new Date("2017-01-26"); alert(date); // La partie heure de la date est supposĂ©e ĂȘtre minuit GMT et // est ajustĂ© en fonction du fuseau horaire dans lequel le code est exĂ©cutĂ© // Donc, le rĂ©sultat pourrait ĂȘtre // jeu. 26 janv. 2017 11:00:00 GMT + 1100 (heure avancĂ©e de l'Est) // ou // mer. 25 janv. 2017 16:00:00 GMT-0800 (Heure standard du Pacifique) new Date(annĂ©e, mois, date, heures, minutes, secondes, ms)-
Crée la date avec les composants donnés dans le fuseau horaire local. Seul le premier argument est obligatoire.
Note :
- LâannĂ©e
yeardoit avoir 4 chiffres. Pour des raisons de compatibilitĂ©, 2 chiffres sont Ă©galement acceptĂ©s et considĂ©rĂ©s comme19xx, par ex.98est identique Ă1998ici, mais il est fortement recommandĂ© dâutiliser toujours 4 chiffres. - Le dĂ©compte des mois
monthcommence par0(Janvier) jusquâĂ11(DĂ©cembre). - Le paramĂštre
dateest en fait le jour du mois, sâil est absent alors1est supposĂ©. - Si
heures/minutes/seconds/msest absent, elles sont supposĂ©es Ă©gales Ă0.
Par exemple :
new Date(2011, 0, 1, 0, 0, 0, 0); // // 1 Jan 2011, 00:00:00 new Date(2011, 0, 1); // la mĂȘme chose car les heures etc sont Ă©gales Ă 0 par dĂ©fautLa prĂ©cision maximale est de 1 ms (1/1000 sec) :
let date = new Date(2011, 0, 1, 2, 3, 4, 567); alert( date ); // 1.01.2011, 02:03:04.567 - LâannĂ©e
Composants de date dâaccĂšs
Il existe de nombreuses mĂ©thodes pour accĂ©der Ă lâannĂ©e, au mois, etc. Ă partir de lâobjet Date.
- getFullYear()
- Obtenir lâannĂ©e (4 chiffres)
- getMonth()
- Obtenir le mois, de 0 Ă 11.
- getDate()
- Obtenir le jour du mois, de 1 Ă 31.
- getHours(), getMinutes(), getSeconds(), getMilliseconds()
- Obtenir lâheures / les minutes / les secondes / les millisecondes.
getYear(), mais getFullYear()De nombreux moteurs JavaScript implĂ©mentent une mĂ©thode non standard getYear(). Cette mĂ©thode est obsolĂšte. Elle retourne parfois lâannĂ©e Ă 2 chiffres. Sâil vous plaĂźt ne lâutilisez jamais. Il y a getFullYear() pour lâannĂ©e.
De plus, nous pouvons obtenir un jour de la semaine :
- getDay()
- Obtenir le jour de la semaine, de
0(dimanche) Ă6(samedi). Le premier jour est toujours le dimanche, dans certains pays ce nâest pas le cas, mais ça ne peut pas ĂȘtre changĂ©.
Toutes les méthodes ci-dessus renvoient les composants par rapport au fuseau horaire local.
Il existe Ă©galement leurs homologues UTC, qui renvoient jour, mois, annĂ©e, etc. pour le fuseau horaire UTC + 0 : getUTCFullYear(), getUTCMonth(), getUTCDay(). Il suffit dâinsĂ©rer le UTC juste aprĂšs get.
Si votre fuseau horaire local est décalé par rapport à UTC, le code ci-dessous indique différentes heures :
// date actuel
let date = new Date();
// l'heure dans votre fuseau horaire actuel
alert( date.getHours() );
// l'heure dans le fuseau horaire UTC + 0 (heure de Londres sans heure avancée)
alert( date.getUTCHours() );
Outre les méthodes indiquées, il existe deux méthodes spéciales qui ne possÚdent pas de variante UTC :
- getTime()
-
Renvoie lâhorodatage de la date â nombre de millisecondes Ă©coulĂ©es Ă partir du 1er janvier 1970 UTC + 0.
- getTimezoneOffset()
-
Renvoie la diffĂ©rence entre le fuseau horaire local et lâheure UTC, en minutes :
// si vous ĂȘtes dans le fuseau horaire UTC-1, gĂ©nĂšre 60 // si vous ĂȘtes dans le fuseau horaire UTC + 3, les sorties -180 alert( new Date().getTimezoneOffset() );
Réglage des composants de date
Les méthodes suivantes permettent de définir des composants date / heure :
setFullYear(year, [month], [date])setMonth(month, [date])setDate(date)setHours(hour, [min], [sec], [ms])setMinutes(min, [sec], [ms])setSeconds(sec, [ms])setMilliseconds(ms)setTime(milliseconds)(définit la date entiÚre en millisecondes depuis 01.01.1970 UTC)
Comme nous pouvons le constater, certaines méthodes peuvent définir plusieurs composants à la fois, par exemple setHours. Les composants non mentionnés ne sont pas modifiés.
Par exemple :
let today = new Date();
today.setHours(0);
alert(today); // encore aujourd'hui, mais l'heure est changée à 0
today.setHours(0, 0, 0, 0);
alert(today); // toujours aujourd'hui, maintenant 00:00:00 pile.
Auto-correction
Lâauto-correction est une fonctionnalitĂ© trĂšs pratique des objets Date. Nous pouvons dĂ©finir des valeurs hors limites et le systĂšme sâajustera automatiquement.
Par exemple :
let date = new Date(2013, 0, 32); // 32 Jan 2013 ?!?
alert(date); // ...c'est le 1st Feb 2013!
Les composants de date hors limites sont traités automatiquement.
Supposons que nous devions augmenter la date «28 fĂ©vrier 2016» de 2 jours. Ce peut ĂȘtre «2 mars» ou «1 mars» dans le cas dâune annĂ©e bissextile. Nous nâavons pas besoin dây penser. Il suffit dâajouter 2 jours. Lâobjet Date fera le reste :
let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);
alert( date ); // 1 Mar 2016
Cette fonctionnalité est souvent utilisée pour obtenir la date aprÚs la période donnée. Par exemple, obtenons la date «70 secondes aprÚs maintenant» :
let date = new Date();
date.setSeconds(date.getSeconds() + 70);
alert( date ); // montre la date correcte
Nous pouvons Ă©galement dĂ©finir zĂ©ro ou mĂȘme des valeurs nĂ©gatives. Par exemple :
let date = new Date(2016, 0, 2); // 2 Jan 2016
date.setDate(1); // met le jour 1 du mois
alert( date );
date.setDate(0); // la date minimum est le 1, le dernier jour du mois précédent devient alors la date
alert( date ); // 31 Dec 2015
De Date à numéro, différence de date
Lorsquâun objet Date est converti en nombre, il devient lâhorodatage identique Ă date.getTime() :
let date = new Date();
alert(+date); // le nombre de millisecondes, identique Ă date.getTime()
Lâeffet secondaire important : les dates peuvent ĂȘtre soustraites, le rĂ©sultat est leur diffĂ©rence en ms.
Cela peut ĂȘtre utilisĂ© pour les mesures de temps :
let start = new Date(); // démarre le compteur
// fait le travail
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = new Date(); // fin
alert( `The loop took ${end - start} ms` );
Date.now()
Si nous voulons seulement mesurer la diffĂ©rence, nous nâavons pas besoin de lâobjet Date.
Il existe une mĂ©thode spĂ©ciale Date.now() qui renvoie lâhorodatage actuel.
Il est sĂ©mantiquement Ă©quivalent Ă new Date().getTime(), mais il ne crĂ©e pas dâobjet Date intermĂ©diaire. Donc, câest plus rapide et cela nâexerce aucune pression sur le ramasse-miettes.
Il est principalement utilisĂ© pour des raisons de commoditĂ© ou lorsque les performances sont importantes, comme dans les jeux en JavaScript ou dans dâautres applications spĂ©cialisĂ©es.
Donc câest probablement mieux :
let start = Date.now(); // compteur en millisecondes depuis le 1 Jan 1970
// fait le travail
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = Date.now(); // fin
alert( `The loop took ${end - start} ms` ); // soustrait des nombres, pas des dates
Benchmarking
Si nous voulons une rĂ©fĂ©rence fiable en matiĂšre de fonction gourmande en ressources processeur, nous devons ĂȘtre prudents.
Par exemple, mesurons deux fonctions qui calculent la différence entre deux dates : laquelle est la plus rapide ?
Ces mesures de performance sont souvent appelĂ©es âbenchmarksâ.
// nous avons date1 et date2, quelle fonction retourne plus rapidement leur différence en ms ?
function diffSubtract(date1, date2) {
return date2 - date1;
}
// ou
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
Ces deux font exactement la mĂȘme chose, mais lâun dâeux utilise un date.getTime() explicite pour obtenir la date en ms, et lâautre repose sur une transformation date Ă nombre. Leur rĂ©sultat est toujours le mĂȘme.
Alors, lequel est le plus rapide ?
La premiĂšre idĂ©e peut ĂȘtre de les exĂ©cuter plusieurs fois de suite et de mesurer le dĂ©calage horaire. Pour notre cas, les fonctions sont trĂšs simples, nous devons donc le faire environ 100 000 fois.
Mesurons :
function diffSubtract(date1, date2) {
return date2 - date1;
}
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
function bench(f) {
let date1 = new Date(0);
let date2 = new Date();
let start = Date.now();
for (let i = 0; i < 100000; i++) f(date1, date2);
return Date.now() - start;
}
alert( 'Time of diffSubtract: ' + bench(diffSubtract) + 'ms' );
alert( 'Time of diffGetTime: ' + bench(diffGetTime) + 'ms' );
Wow! Utiliser getTime() est beaucoup plus rapide ! Câest parce quâil nây a pas de conversion de type, il est beaucoup plus facile pour JavaScript de faire le calcul.
Ok, nous avons quelque chose. Mais ce nâest pas encore une bonne rĂ©fĂ©rence.
Imaginons quâau moment de lâexĂ©cution du processeur bench(diffSubtract), on faisait quelque chose en parallĂšle et que cela prenait des ressources. Et au moment de lâexĂ©cution du bench(diffGetTime), le travail est terminĂ©.
Un scĂ©nario assez rĂ©el pour un systĂšme dâexploitation moderne multi-processus.
En conséquence, le premier test aura moins de ressources de processeur que le second. Cela peut conduire à des résultats erronés.
Pour un benchmarking plus fiable, lâensemble des tests doit ĂȘtre rĂ©exĂ©cutĂ© plusieurs fois.
Par exemple, comme ceci :
function diffSubtract(date1, date2) {
return date2 - date1;
}
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
function bench(f) {
let date1 = new Date(0);
let date2 = new Date();
let start = Date.now();
for (let i = 0; i < 100000; i++) f(date1, date2);
return Date.now() - start;
}
let time1 = 0;
let time2 = 0;
// exécute bench(diffSubtract) et bench(diffGetTime) chacune 10 fois en alternance
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
alert( 'Total time for diffSubtract: ' + time1 );
alert( 'Total time for diffGetTime: ' + time2 );
Les moteurs JavaScript modernes commencent Ă appliquer des optimisations avancĂ©es uniquement au «code dynamique» qui sâexĂ©cute plusieurs fois (inutile dâoptimiser les tĂąches rarement exĂ©cutĂ©es). Ainsi, dans lâexemple ci-dessus, les premiĂšres exĂ©cutions ne sont pas bien optimisĂ©es. Nous voudrons peut-ĂȘtre ajouter un test pour sâĂ©chauffer :
// ajouté pour "s'échauffer" avant la boucle principale
bench(diffSubtract);
bench(diffGetTime);
// maintenant comparons
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
Les moteurs JavaScript modernes effectuent de nombreuses optimisations. Ils peuvent modifier les rĂ©sultats des «tests artificiels» par rapport à «lâutilisation normale», en particulier lorsque nous comparons quelque chose de trĂšs petit. Donc, si vous voulez sĂ©rieusement comprendre les performances, alors Ă©tudiez le fonctionnement du moteur JavaScript. Et puis vous nâaurez probablement pas besoin de micro-points de repĂšre.
Un bon paquet dâarticle a propos de V8 se trouve ici https://mrale.ph.
Date.parse dâune chaĂźne de caractĂšre
La methode Date.parse(str) peut lire une date provenant dâune chaĂźne de caractĂšres.
Le format de la chaĂźne de caractĂšres doit ĂȘtre : YYYY-MM-DDTHH:mm:ss.sssZ, oĂč :
YYYY-MM-DDâ est la date : annĂ©e-mois-jour.- Le caractĂšre
"T"est utilisĂ© comme dĂ©limiteur. HH:mm:ss.sssâ correspond Ă lâheure : heures, minutes, secondes et millisecondes.- La partie optionnelle
Zindique le fuseau horaire au format+-hh:mm. Une seule lettreZqui signifierait UTC + 0.
Des variantes plus courtes sont Ă©galement possibles, telles que YYYY-MM-DD ou YYYY-MM ou mĂȘme YYYY.
Lâappel Ă Date.parse(str) analyse la chaĂźne au format indiquĂ© et renvoie lâhorodatage (nombre de millisecondes Ă compter du 1er janvier 1970 UTC + 0). Si le format nâest pas valide, renvoie NaN.
Par exemple :
let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (horodatage)
Nous pouvons crĂ©er instantanĂ©ment un nouvel objet Date Ă partir de lâhorodatage :
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') );
alert(date);
Résumé
- La date et lâheure en JavaScript sont reprĂ©sentĂ©es avec lâobjet
Date. Nous ne pouvons pas créer une date «seule» ou une heure «seule» : les objetsDatecomportent toujours les deux. - Les mois sont comptés à partir de zéro (janvier est le mois zéro).
- Les jours de la semaine dans
getDay()sont Ă©galement comptĂ©s Ă partir de zĂ©ro (câest le dimanche). - Lâobjet
Datese corrige automatiquement lorsque des composants hors plage sont dĂ©finis. Câest pratique pour ajouter / soustraire des jours / mois / heures. - Les dates peuvent ĂȘtre soustraites, ce qui donne leur diffĂ©rence en millisecondes. En effet, une date devient un horodatage lorsquâelle est convertie en nombre.
- Utilisez
Date.now()pour obtenir lâhorodatage actuel rapidement.
Notez que contrairement à de nombreux autres systÚmes, les horodatages JavaScript sont exprimés en millisecondes et non en secondes.
De plus, nous avons parfois besoin de mesures de temps plus prĂ©cises. JavaScript lui-mĂȘme ne permet pas de mesurer le temps en microsecondes (un millioniĂšme de seconde), mais la plupart des environnements le fournissent. Par exemple, le navigateur a performance.now() qui donne le nombre de millisecondes Ă partir du dĂ©but du chargement de la page avec une prĂ©cision de lâordre de la microseconde (3 chiffres aprĂšs le point) :
alert(`Loading started ${performance.now()}ms ago`);
// Quelque chose comme : "Le chargement a commencé il y a 34731.26000000001ms"
// .26 indique les microsecondes (260 microsecondes)
// plus de 3 chiffres aprÚs le point décimal sont des erreurs de précision, seuls les 3 premiers sont corrects
Node.js a un module microtime et dâautres moyens. Techniquement, presque tous les appareils et environnements permettent dâobtenir plus de prĂ©cision, ce nâest pas seulement dans Date.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâŠ)