Pourquoi JavaScript Date.getTimezoneOffset () considère-t-il "-05: 00" comme un décalage positif?

J'ai remarqué que pour nous sur le fuseau horaire de l'Est ("America / New_York") avec le décalage horaire de "-05: 00" Date.getTimezoneOffset () renvoie un nombre positif de 300. Je m'attends à ce que le décalage en minutes soit négatif dans les zones à À l'ouest d'Utc, et pour être positif dans les régions à l'est de l'Utc, mais apparemment il est "flippded". Quel est le raisonnement derrière cette décision?

Http://momentjs.com/ suit la même règle et revient …

moment.parseZone("01/13/2014 3:38:00 PM +01:00").zone() // == -60 moment.parseZone("01/13/2014 3:38:00 PM -01:00").zone() // == 60 

Dans le même temps, DateTimePicker http://trentrichardson.com/examples/timepicker/ ne bascule pas lorsque vous définissez son paramètre initial de «fuseau horaire». Est-ce faux?

    Parce que c'est ainsi qu'il est défini. Citation du doc ​​( MDN ):

    Le décalage horaire est la différence, en minutes, entre UTC et l'heure locale. Notez que cela signifie que le décalage est positif si le fuseau horaire local est derrière UTC et négatif s'il est en avance .

    Elaborer un peu sur la réponse parfaitement acceptable de raina77ow …

    Tout d'abord, comprendre que les normes principales impliquées ici sont ISO 8601 et RFC 822 (et ses proches 733 , 1123 et 2822 ), qui étaient tous (en partie) dérivés de ANSI X3.51-1975.

    Toutes ces normes utilisent la convention de valeurs positives à l'Est de UTC / GMT et les valeurs négatives étant à l'ouest de UTC / GMT.

    La seule norme dont je suis conscient a inversé est POSIX (voir la section POSIX du wiki de la fuseau horaire , et cet article ), et explique par conséquent pourquoi les zones horaires Olson à compatibilité ascendante comme "Etc / GMT + 5" ont leur Signe inversé. (Bien sûr, il est possible qu'il y ait d'autres usages et je ne les ignore pas.)

    Croyez-le ou non, JavaScript fait les deux moyens. Lorsqu'il est utilisé comme chaîne (dans la syntaxe RFC 822 ou ISO 8601), il utilise des heures et des minutes avec des décalages positifs à l' est de l'UTC. Mais lorsque vous appelez la méthode getTimezoneOffset() sur l'objet Date , il renvoie des minutes entières positives à l' Ouest de l'UTC.

    On ne peut qu'expliquer pourquoi cette incohérence existe. La spécification ECMAScript est pleine de problèmes comme celui-ci. C'est peut-être parce que lorsque vous voyez un décalage dans une chaîne ISO 8601 ou RFC 822, ce décalage a déjà été appliqué. Mais lorsque vous appelez getTimezoneOffset() c'est le décalage à appliquer pour le ramener à UTC.

    Par exemple, 2014-01-01T00:00:00-05:00 est égal à 2014-01-01T05:00:00Z . Alors getTimezoneOffset() renverrait 300 . Si vous ajoutez 300 minutes à la valeur d'origine, vous revenez à UTC.

    Ce sont les deux côtés de la même pièce. Voir?

    En ce qui concerne si ce contrôle spécifique est incorrect ou non, je ne suis pas sûr. Je ne suis pas familier avec ce contrôle particulier. Je vois dans leurs docs l'exemple de -0400 étant égal à -240, qu'on pourrait s'attendre à inverser, mais encore une fois, il est un peu étrange d'avoir une valeur comme -240 présentée à un utilisateur. Vraiment, vous ne devez pas exposer les décalages à un utilisateur de toute façon (IMHO). Vous êtes mieux d'utiliser un contrôleur de sélection de fuseau horaire, comme celui-ci ou celui-ci .