En utilisant Moment.js, je ne peux pas transformer un objet moment correct en un objet date avec des fuseaux horaires. Je n'arrive pas à obtenir la date correcte.
Exemple:
var oldDate = new Date(),
momentObj = moment(oldDate).tz("MST7MDT"),
newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())
Utilisez cette fonction pour transformer un objet momentané en un objet date :
De http://momentjs.com/docs/#/displaying/as-javascript-date/
moment().toDate();
Rendement :
Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
Tant que vous avez initialisé [moment-timezone][1] avec [les données pour les zones que vous voulez][2], votre code fonctionne comme prévu.
Vous convertissez correctement le moment en fuseau horaire, ce qui est reflété dans la deuxième ligne de sortie de momentObj.format()
.
Le passage à l'heure UTC ne se contente pas de supprimer le décalage, il repasse au fuseau horaire UTC. Si vous faites cela, vous n'avez pas du tout besoin de l'appel original .tz()
. Vous pouvez simplement faire moment.utc()
.
Peut-être essayez-vous simplement de changer la chaîne de format de sortie ? Dans ce cas, il suffit de spécifier les paramètres que vous voulez à la méthode format
:
momentObj.format("YYYY-MM-DD HH:mm:ss")
En ce qui concerne les deux dernières lignes de votre code, lorsque vous revenez à un objet Date
en utilisant toDate()
, vous abandonnez le comportement de moment.js et revenez au comportement de JavaScript. Un objet Date
en JavaScript sera toujours imprimé dans le fuseau horaire local de l'ordinateur sur lequel il fonctionne. Il n'y a rien que moment.js puisse faire à ce sujet.
Quelques autres petites choses :
Bien que le constructeur de moment puisse prendre une Date
, il est généralement préférable de ne pas en utiliser. Pour "now" ;, n'utilisez pas moment(new Date())
. Au lieu de cela, utilisez simplement moment()
. Les deux fonctionneront, mais c'est inutilement redondant. Si vous effectuez un parsing à partir d'une chaîne, passez cette chaîne directement dans moment. N'essayez pas de l'analyser d'abord en une Date
. Vous constaterez que l'analyseur de moment est beaucoup plus fiable.
Les fuseaux horaires comme MST7MDT
sont là pour des raisons de rétrocompatibilité. Ils proviennent de fuseaux horaires de style POSIX, et seulement quelques-uns d'entre eux sont dans les données de la TZDB. A moins que cela ne soit absolument nécessaire, vous devriez utiliser une clé telle que America/Denver
.
[1] : http://momentjs.com/timezone/ [2] : http://momentjs.com/timezone/data/
.toDate
n'a pas vraiment fonctionné pour moi, donc, voici ce que j'ai fait :
futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))
J'espère que cela vous aidera