74 votes

Quelle est la différence entre la nouvelle date ("2017-01-01") et la nouvelle date ("2017-1-1")?

Je saisis new Date("2017-01-01") dans la console chrome, la sortie indique que son heure est 8, mais new Date("2017-01-1") et new Date("2017-1-01") indiquent que leurs heures sont égales à 0, alors comment new Date(dateString) analyser?

 new Date("2017-01-01")
// Sun Jan 01 2017 08:00:00 GMT+0800 (中国标准时间)*
new Date("2017-01-1")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*
new Date("2017-1-1")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*
new Date("2017-1-01")
// Sun Jan 01 2017 00:00:00 GMT+0800 (中国标准时间)*
 

78voto

Derek 朕會功夫 Points 23487

"2017-01-01" suit la norme ISO ES5 Date Heure format de Chaîne de caractères (simplification de la norme ISO 8601 Format Étendu), et il est donc dans l'heure UTC, qui est de 8h en Chine. Toutes les autres chaînes sont analysées comme l'heure locale en Chrome1.


1 Pertinentes du code source de Chrome: https://cs.chromium.org/chromium/src/v8/src/dateparser-inl.h?type=cs&l=16

Date de l'analyse en Chrome suit la norme ES5 règles ainsi que ces règles supplémentaires:

  • Tout mot inconnu avant, le premier nombre est ignoré.
  • Entre parenthèses le texte est ignoré.
  • Un nombre non signé suivie par : est une valeur de temps, et est ajouté à l' TimeComposer. Un numéro de suivi par :: ajoute un deuxième zéro. Un numéro de suivi par . est aussi un temps et doit être suivie par millisecondes. Un autre numéro est un composant de date et est ajouté à l' DayComposer.
  • Un nom de mois (ou vraiment: tout mot ayant le même trois premières lettres d'un nom de mois) est comptabilisé comme un mois nommé dans l' Day compositeur.
  • Un mot reconnaissable comme un fuseau horaire est inscrite en tant que telle, est - (+|-)(hhmm|hh:).
  • Héritage dates de ne pas accorder plus de signes (+ ou -) ou inégalée ) après un certain nombre a été lu (avant, le premier nombre, des ordures est autorisé).
  • Toutes les chaînes que satisfaire l'ES5 règles et les règles ci-dessus seront analysés à l'aide de ES5 règles. Cela signifie "1970-01-01" sera en heure UTC-zone non en heure locale.

Qu'est-ce que cela signifie?

Notons d'abord que "2017-01-01" est analysée en temps UTC, parce que c'est une "date" de la chaîne au lieu d'une "date-heure" de la chaîne, et il correspond à l'ES5 définition de "date" de la chaîne. Si le temps est attaché, puis il va suivre la norme ISO et de l'analyser en heure locale.

Exemples:

  • 2017-01-01 - Jan 1, en 2017, à l'heure UTC
  • 2017-01-01T00:00 - Jan 1, en 2017, heure locale
  • 2017-1-1 - Jan 1, en 2017, heure locale
  • 2017-(hello)01-01 - Jan 1, en 2017, heure locale
  • may 2017-01-01 - 1er mai 2017, heure locale
  • mayoooo 2017-01-01 - 1er mai 2017, heure locale
  • "jan2017feb-mar01apr-may01jun" - Jun 1, en 2017, heure locale

18voto

T.J. Crowder Points 285826

la différence entre la nouvelle Date("2017-01-01") et de la nouvelle Date("2017-1-1")

new Date("2017-01-01") est-spec (la suite ci-dessous). new Date("2017-1-1") n'est pas, et donc tombe en arrière sur tout "...spécifiques à l'implémentation de l'heuristique ou la mise en œuvre spécifique de formats de date" le moteur JavaScript veut appliquer. E. g., vous n'avez aucune garantie de savoir comment (ou si) il va réussir à analyser et, dans l'affirmative, si elle sera analysée comme l'UTC ou heure locale.

Bien qu' new Date("2017-01-01") est-spec, malheureusement, ce que les navigateurs sont censés faire avec elle a été une cible en mouvement, car il n'a pas un fuseau horaire indicateur sur elle:

  • Dans l'ES5 (décembre 2009), les cordes sans un fuseau horaire indicateur étaient censés être analysée comme l'UTC. Mais c'est en contradiction avec la norme ISO-8601 standard le format de date/heure est basé sur, qui dit des chaînes sans un fuseau horaire indicateur sont censées être à l'heure locale, pas de l'UTC. Donc, dans l'ES5, new Date("2017-01-01") est analysée en temps UTC.
  • Dans ES2015 (aka ES6, juin 2015), des chaînes sans un fuseau horaire indicateur étaient censés être, heure locale, pas de l'UTC, à l'instar de la norme ISO-8601. Ainsi, dans ES2015, new Date("2017-01-01") est analysée comme l'heure locale.
  • Mais, qui a changé de nouveau dans ES2016 (juin 2016), car les navigateurs a été l'analyse de date uniquement les formes avec - en eux que l'UTC depuis des années. Afin de ES2016, date seulement de formes (comme "2017-01-01") sont analysées en UTC, mais la date/l'heure de formes (comme "2017-01-01T00:00:00") sont analysées en heure locale.

Malheureusement, pas tous les moteurs JavaScript actuellement de mettre en œuvre la spécification. Chrome (de cette écriture, v56) analyse de la date/heure formes en UTC même si elles devraient être à l'heure locale (donc ne IE9). Mais Chrome, Firefox, et IE11 (je n'ai pas IE10 ou Bord à portée de main) poignée de date uniquement correctement les formulaires (UTC). IE8 ne pas mettre en œuvre la norme ISO-8601 forme à tous (le fait d'avoir été publié avant l'ES5 spec a été publié).

3voto

Yeldar Kurmangaliyev Points 14018

Lors de l'analyse des dates, JavaScript interprète ISO dates de l'heure UTC et autres formats, heure locale.

Comme MDN article l'indique,

Lorsque la chaîne est la norme ISO 8601 uniquement la date, le fuseau horaire UTC est utilisé pour interpréter les arguments.

Étant donné une chaîne de date de "7 Mars 2014", parse (), ce qui suppose un fuseau horaire local, mais compte tenu d'un format ISO, telles que "2014-03-07" il va assumer un fuseau horaire de GMT (ES5 et ECMAScript 2015). Par conséquent, la Date d'objets fabriqués à l'aide de ces chaînes peuvent représenter différents moments dans le temps en fonction de la version de ECMAScript pris en charge sauf si le système est configuré avec une zone de l'heure locale de l'UTC. Cela signifie que les deux chaînes qui apparaissent équivalent, peut avoir deux valeurs différentes selon le format de la chaîne est convertie.

// 2017-03-28 is interpreted as UTC time,
// shown as 2017-03-28 00:00:00 in UTC timezone,
// shown as 2017-03-28 06:00:00 in my timezone:
console.log("ISO dates:");
var isoDates = [new Date("2017-03-28")];
for (var dt of isoDates)
{
  console.log(dt.toUTCString() + " / " + dt.toLocaleString());
}

// Other formats are interpreted as local time, 
// shown as 2017-03-27 18:00:00 in my timezone,
// shown 2017-03-28 00:00:00 in my timezone:
console.log("Other formats:");
var otherDates = [new Date("2017-3-28"), new Date("March 28, 2017"), new Date("2017/03/28")];
for (var dt of otherDates)
{
  console.log(dt.toUTCString() + " / " + dt.toLocaleString());
}

2voto

Raman Sahasi Points 14959

Ce format est la norme internationale (format ISO)

 new Date("2017-01-01")
 

Cela garantit la même sortie sur tous les navigateurs.

Cependant, les autres formats peuvent changer en fonction du navigateur, car ils ne sont pas aussi bien définis.

Comme vous pouvez voir que ce format

 new Date("2017-1-1")
 

est analysé avec succès en chrome, mais donne une erreur dans IE 11

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X