Étant donné le volume de questions relatives au fuseau horaire, j'aurais pensé pouvoir trouver la réponse à ce problème, mais je n’ai eu aucun succès.
Existe-t-il un moyen d'utiliser moment.js
pour analyser une chaîne ISO-8601 mais que celle-ci soit analysée dans mon timzeone local? En gros, je veux ignorer les informations de fuseau horaire fournies dans la chaîne ISO.
Par exemple, si je suis dans le fuseau horaire de l’EDT:
var x = moment( "2012-12-31T00:00:00+0000" );
me donnera: "2012-12-30T19: 00: 00-5000"
Je cherche à ignorer les informations sur le fuseau horaire et à simplement me donner un instant équivalent à "2012-12-31T00: 00: 00-5000" heure locale (HAE).
Je ne pense pas que vous vouliez vraiment ignorer le décalage. En fin de compte, cela remplacerait simplement le décalage que vous avez fourni avec celui de votre fuseau horaire local, ce qui créerait un moment complètement différent.
Peut-être cherchez-vous simplement un moyen de garder un instant le fuseau horaire qui lui a été attribué? Si tel est le cas, utilisez la fonction moment.parseZone
. Par exemple:
var m = moment.parseZone("2012-12-31T00:00:00+0000");
var s = m.format(); // "2012-12-31T00:00:00+00:00"
Vous pouvez également y parvenir avec moment.utc
. La différence est que moment.parseZone
conservera l’offset que vous lui aurez attribué, alors que moment.utc
s’ajustera à l’UTC si vous lui attribuez un offset non nul.
J'ai résolu ce problème en fournissant un deuxième format au format et en utilisant la méthode de Moment de caractères d'échappement , ainsi que des crochets entourant le fuseau horaire.
moment("2016-01-01T05:00:00-05:00", "YYYY-MM-DDTHH:mm:ss[Z]").startOf("hour").format()
Cela créera toujours des objets moment en utilisant votre fuseau horaire local, mais ne fera aucun type de calcul de fuseau horaire automatique. Ainsi, l’exemple ci-dessus vous donnera 5 heures du matin, quel que soit le fuseau horaire fourni.
Je sais que je suis en retard à la fête, j'avais la même question et mes recherches ne m'ont pas rapproché. Je suis tombé en panne et j'ai lu la documentation et il y a une option pour un format String +:
Documents de format et de chaîne
moment (String, String);
moment (String, String, String);
moment (String, String, Boolean);
moment (String, String, String, Boolean);
et plus de mots, alors ceci:
Sauf si vous spécifiez un décalage de fuseau horaire, l'analyse d'une chaîne crée une date dans le fuseau horaire actuel.
moment("2010-10-20 4:30", "YYYY-MM-DD HH:mm"); // parsed as 4:30 local time
moment("2010-10-20 4:30 +0000", "YYYY-MM-DD HH:mm Z"); // parsed as 4:30 UTC
La partie qui m'a donné une pause était l'exemple utilisé pour analyser l'heure locale en omettant le +0000, ce qui m'a amené à penser que la chaîne d'entrée devait avoir cette suppression, mais ce n'est pas le cas.
exemple:
var time = "2012-12-31T00:00:00+0000";
var x = moment(time); // Sun Dec 30 2012 19:00:00 GMT-0500
var y = moment(time,'YYYY-MM-DD'); //Mon Dec 31 2012 00:00:00 GMT-0500
Si vous savez avec certitude que votre chaîne d'entrée est au format ISO-8601, vous pouvez simplement supprimer les 5 derniers chiffres et l'utiliser dans le constructeur Moment.
var input = "2012-12-31T00:00:00+0000"
input = input.substring(0, input.length-5)
moment(input).toString()
> "Mon Dec 31 2012 00:00:00 GMT-0600"
Il y a des raisons valables de faire ce que le PO demande. La façon la plus simple de procéder avec Moment consiste à utiliser sa méthode parseZone(date)
. Pas de futzing avec la manipulation de chaîne ou d'appels multiples. Il analyse efficacement la chaîne de date comme si elle se trouvait dans le fuseau horaire local du navigateur.
Vous pouvez ignorer complètement le fuseau horaire du navigateur en créant un nouveau moment en utilisant moment.utc()
au lieu de moment()
.
Par exemple, si vous essayez uniquement de travailler avec une date/heure UTC de l'heure actuelle du navigateur mais souhaitez supprimer les données de son fuseau horaire, vous pouvez recréer l'heure actuelle du navigateur dans un format UTC en procédant comme suit:
let nowWithTimezone = moment();
let nowInUtc = moment.utc(nowWithTimezone.format('MM/DD/YYYY HH:mm'), 'MM/DD/YYYY HH:mm');
Documentation supplémentaire sur moment.utc()
: https://momentjs.com/docs/#/parsing/utc/
Le meilleur moyen est d'utiliser:
dt = moment("Wed Sep 16 2015 18:31:00 GMT-0400", "ddd MMM DD YYYY HH:mm:ss GMT-0400",true);
Et pour afficher à nouveau convertir au fuseau horaire souhaité:
dt.utcOffset("-04:00").toString()
output > Wed Sep 16 2015 18:31:00 GMT-0400
La logique par défaut de Momentjs formatera l'heure donnée avec le fuseau horaire local. Pour formater la date d'origine, j'ai écrit une fonction:
https://github.com/moment/moment/issues/2788#issuecomment-321950638
C'est une tâche difficile à faire avec MomentJS, cela dépendra fondamentalement de votre fuseau horaire actuel.
La documentation est également vague pour cette tâche spécifique. Pour ma part, le problème a été résolu en ajoutant des heures à la date avant de la convertir au format JSON.
var dt = moment("Sun Sep 13 2015 00:00:00 GMT-0400", "ddd MMM DD YYYY HH:mm:ss GMT-0400", false);
var date = dt.add(2, 'hour').toJSON();
console.log(date); //2015-09-13T00:00:00.000Z