moment.js - UTC donne la mauvaise date
Pourquoi ne moment.js UTC toujours montrer la mauvaise date. Par exemple à partir de chrome developer console:
moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
//or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Deux d'entre eux seront de retour "2013-07-17" pourquoi est-il de retour 17 au lieu de 18, qui a été passé.
Mais si j'utilise momentjs sans l'utc:
moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Je serai de retour "2013-07-18" qui est ce que j'attends aussi lors de l'utilisation de moment.js UTC.
Est-ce à dire on ne peut pas obtenir la date correcte lors de l'utilisation de moment.js l'UTC?
- Je ne pense pas que vous avez besoin
toString()
aprèsformat()
(déjà, elle renvoie une chaîne de caractères).
Vous devez vous connecter pour publier un commentaire.
Par défaut, MomentJS analyse en heure locale. Si seulement une chaîne de date (n'ayant pas le temps) est fourni, le temps par défaut à minuit.
Dans votre code, vous créez une date et puis le convertir en le fuseau horaire UTC (en fait, c'est le moment de l'instance passer à UTC mode), donc quand il est formaté, il est décalé (selon votre heure locale) vers l'avant ou vers l'arrière.
Si le fuseau horaire est UTC+N (N étant un nombre positif), et vous analyser une date en chaîne de caractères, vous obtiendrez la date précédente.
Voici quelques exemples pour l'illustrer (mon décalage de l'heure locale est UTC+3 au cours de l'heure d'été):
Si vous souhaitez que la date-time chaîne interprété comme l'UTC, vous devez être explicite à ce sujet:
ou, comme Matt Johnson mentionne dans sa réponse, vous pouvez (et devrait probablement) de l'analyser comme une date UTC, en premier lieu, à l'aide de
moment.utc()
et comprennent la chaîne de format comme deuxième argument pour éviter toute ambiguïté.Pour aller dans l'autre sens et de convertir une date UTC à une date locale, vous pouvez utiliser le
(locale()
méthode, comme suit:new Date('07-18-2013 UTC')
ne fonctionnera pas avec IE8, si vous vous souciez.Les deux
Date
etmoment
va analyser la chaîne d'entrée dans le fuseau horaire local du navigateur par défaut. CependantDate
est parfois incompatible avec le présent sujet. Si la chaîne est spécifiquementYYYY-MM-DD
, à l'aide de des traits d'union, ou si c'estYYYY-MM-DD HH:mm:ss
, il va l'interpréter comme heure locale. Contrairement àDate
,moment
sera toujours cohérents sur la façon dont il traite.La bonne façon d'analyser une entrée instant que l'UTC dans le format que vous devrait être comme ceci:
Reportez-vous à cette documentation.
Si vous voulez formater différemment pour la sortie, vous voulez faire cela:
Vous n'avez pas besoin d'appeler
toString
explicitement.Noter qu'il est très important de fournir le format d'entrée. Sans elle, une date comme
01-04-2013
peuvent être traités soit comme Jan de 4ème ou de 1 Avril, en fonction de la culture des paramètres du navigateur.moment
sur la console n'est pas très utile. Vous êtes probablement à la recherche à l'une de ses propriétés internes. Vous devez le formater avant de vérifier les résultats. Par exemplemoment.utc().format()
oumoment().format()
.new Date('2010-12-12')
me donneDate {Sat Dec 11 2010 19:00:00 GMT-0500 (Eastern Daylight Time)}
dans FF 38.0.5. Juste pour contextualiser ce que "dans le temps local" signifie exactement-dans ce cas, il semble dire, "Date
assumera un temps zoneless chaîne est en UTC et l'analyse à l'heure locale."d.getUTCDate()
=12
etd.getDate()
=11
'2012-12-12'
est UTC b/c il est dans un format ISO, mais'December 12, 2012'
et même'2012/12/12'
sont analysées avec un fuseau horaire local dans l'ES5), mais que vous avez me battre pour elle. Si grande que ES6 les rend toutes les collectivités locales [dit-il sarcastiquement]. Les Dates sont une douleur, (c) de l'Avent de DatesZ
) est fourni, la zone est supposer être local. EcmaScript ignoré ce dans l'original spec et tout pris en charge toutes les normes ISO formats doivent être UTC par défaut. Ils sont à la "fixation" pour ES6, de sorte qu'il est conforme avec la norme ISO spec. Il va être intéressant de voir comment beaucoup de nouveaux bugs sont créés par le "fix". 🙂