J'essaye de passer les deux chaînes de date à new Date(t)
.
Je m'attends à ce que les deux chaînes représentent la même heure, après tout, si j'omets l'heure, ne devrait-il pas être minuit ce jour-là?
Mais en même temps,
new Date("2016-02-16 00:00")
renvoie 16/02/2016, minuit, heure locale comme prévu,
new Date("2016-02-16")
renvoie 16/02/2016, minuit UTC, ce qui est faux, ou du moins pas ce à quoi je m'attendais étant donné ce que l'autre chaîne analyse.
Je comprendrais qu'ils aient tous les deux le même comportement, que ce soit pour renvoyer l'heure comme heure locale ou comme UTC, mais il semble très incohérent pourquoi ils renvoient des choses différentes comme celle-ci.
Comme solution de contournement, chaque fois que je rencontre une date qui n'a pas d'horodatage correspondant, je peux ajouter "00:00" pour obtenir un comportement cohérent, mais il semble que cela soit plutôt fragile.
J'obtiens cette valeur d'un élément INPUT, de type 'datetime-local', il semble donc particulièrement incohérent que je doive contourner une valeur retournée par un élément de page.
Est-ce que je fais quelque chose de mal ou devrais-je faire quelque chose différemment?
la source
2016-02-16 00:00
- cela ne ressemble pas du tout à l'heure valide. ecma-international.org/ecma-262/6.0/... , mais même après l'avoir misT
là, il se comporte effectivement différemmentRéponses:
C'est ce que dit la spécification ES5.1 :
Il dit aussi:
Étant donné que le format nécessite un
T
séparateur entre la date et l'heure, les heures valides vont à UTC:... tandis que dans node.js, une heure invalide (sans le séparateur T) semble aller à l'heure locale spécifique à l'implémentation:
Notez que ES6 a changé cela, dans la même partie de la documentation qu'il change:
La joie de rompre les changements .
Éditer
Selon TC39 , la spécification est censée être interprétée comme des chaînes de date et d'heure sans fuseau horaire (par exemple, "2016-02-16T00: 00: 00") sont traitées comme locales (selon ISO 8601), mais uniquement les chaînes de date (par exemple "2016-02-16") comme UTC (ce qui est incompatible avec l'ISO 8601).
la source
Selon les spécifications :
Et les formats de chaîne de date et d' heure acceptent
2016-02-16
comme date valideAinsi se
2016-02-16
traduit par2016-02-16T00:00:00.000Z
.L'autre date
2016-02-16 00:00
n'est pas conforme au format et son analyse est donc spécifique à l'implémentation. Apparemment, ces dates sont traitées comme ayant un fuseau horaire local et votre exemple de date renverra des valeurs différentes selon le fuseau horaire:Résumé:
NaN
au lieu d' essayer d'analyser les dates non conformes. Testez simplement votre code dans Internet Explorer 11;)la source
Vous rencontrez peut-être des différences entre les implémentations ES5, ES6 et le résultat attendu. Par date.parse chez MDN, "en particulier dans les différentes implémentations ECMAScript où des chaînes telles que" 2015-10-12 12:00:00 "peuvent être analysées en tant que NaN, UTC ou fuseau horaire local" est significative.
Des tests supplémentaires dans Firefox 44 et IE 11 ont révélé qu'ils renvoyaient tous deux un objet de date pour
new Date("2016-02-16 00:00")
, lequel objet renvoie NaN lors de la tentative d'obtention d'une valeur de composant de date, et dont la valeur toString est "Date invalide" (et non "NaN"). Par conséquent, l'ajout de "00:00 pour obtenir un comportement cohérent" peut facilement se briser dans différents navigateurs.Comme indiqué dans d'autres réponses,
new Date("2016-02-16")
utilise un décalage de fuseau horaire de zéro par défaut, produisant minuit UTC au lieu de local.la source
Par
DateParser::Parse()
code source V8 pour Chrome.la source
Il ajoute le décalage du fuseau horaire au
00:00
new Date("2016-02-16")
les sortiesTue Feb 16 2016 05:30:00 GMT+0530 (India Standard Time)
Mon fuseau horaire étant IST avec une valeur de décalage (en minutes)
+330
, il a donc ajouté 330 minutes à 00:00.Selon ecma-262, section 20.3.3.2 Date.parse (chaîne)
Lorsque vous définissez explicitement les unités de temps,
new Date("2016-02-16 00:00")
il utilisera défini commehours
etminutes
,Sinon, comme indiqué ici en 2 0.3.1.16
la source
section 20.3.3.2
The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String.
où prétend-il que ce doit être la même chose?