51 votes

Pourquoi AAAA-MM-JJ! = AAAA / MM / JJ

En Chrome, nous obtenons une certaine étrangeté

 > new Date("2014-01-01") - new Date("2014/01/01")
< 3600000
 

Et c'est parce que

 new Date("2014-01-01")
Wed Jan 01 2014 01:00:00 GMT+0100 (CET)
 

tandis que

 new Date("2014/01/01")
Wed Jan 01 2014 00:00:00 GMT+0100 (CET)
 

Pourquoi le «-» semble-t-il ajouter 1 heure au temps?

26voto

JamesENL Points 3325

Je crois que la différence est causée par Date.parse ajout de l'UTC à une chaîne mais pas les autres, à savoir: / n'est pas un séparateur de Date.parse (), ce qui signifie que l'heure UTC n'est pas ajoutée au temps, une fois qu'il est analysé. Parce qu' ' est un séparateur, il est analysé et puis UTC est ajouté à l'heure renvoyée.

Date.parse est utilisé par l' new Date() méthode et de sa mise en œuvre est spécifique de navigateur, je suis surpris de voir ce genre de chose ne vient pas plus souvent.

Le cahier des charges pour Date.parse dit:

La Chaîne peut être interprétée comme une, heure locale, l'heure UTC, ou une heure dans un autre fuseau horaire, selon le contenu de la Chaîne. La fonction première tente d'analyser le format de la Chaîne selon les règles qui s'appelle dans Date Heure Format de Chaîne de caractères (15.9.1.15). Si la Chaîne n'est pas conforme à ce format, la fonction peut tomber à n'importe quel spécifiques à l'implémentation de l'heuristique ou la mise en œuvre spécifique de formats de date.

Donc, je vous conseille d'ajouter dans un fuseau horaire manuellement avant d'analyser, ou de rejet, le temps retourné en new Date(), cependant, qui peut entraîner des problèmes autour de minuit, etc. La chose la plus sûre serait de voir si vous pouvez obtenir la date dans un plus format spécifique à partir des deux systèmes, avec les informations de fuseau horaire.

12voto

zangw Points 401

Citant le V8 de code source.

Les commentaires de cette fonction

bool DateParser::Parse(Vector<Char> str,
                       FixedArray* out,
                       UnicodeCache* unicode_cache)

Accepter ES5 ISO 8601 date-heure-chaînes ou héritage dates compatible avec Safari.

ES5 ISO 8601 dates:

[('-'|'+')yy]yyyy[-MM[-DD]][THH:mm[:ss[.sss]][Z|(+|-)hh:mm]]

Une chaîne de caractères qui correspond à la fois les formats (par exemple, 1970-01-01) sera analysée comme une ES5 date-time de la chaîne - ce qui signifie qu'il sera, par défaut, à l'heure UTC de la zone. C'est inévitable si la suite de l'ES5 spécification.

Le tiret (-) est correct notation en Date.

1voto

marcokreeft Points 44

C'est à cause de la mondialisation. Le tiret (-) n’est pas une notation anglaise (GMT). Javascript analyse la notation. Essayez de définir la culture, puis utilisez la notation avec tiret.

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