web-dev-qa-db-fra.com

Moment.js transformer en objet date

Utilisation de Moment.js Je ne peux pas transformer un objet de moment correct en un objet de date avec des fuseaux horaires. Je ne peux 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())
500
vadim.zhiltsov

Utilisez ceci pour transformer un objet moment en un objet date:

De http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

Rendements:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
932
Chandrew

Tant que vous avez initialisé moment-fuseau horaire avec les données des zones souhaitées , 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 la sortie de momentObj.format().

Le passage au format UTC ne supprime pas simplement le décalage, il revient au fuseau horaire UTC. Si vous voulez faire cela, vous n’avez pas du tout besoin de l’appel .tz() original. Vous pouvez simplement faire moment.utc().

Peut-être que vous essayez juste de changer la chaîne de format de sortie? Si tel est le cas, indiquez simplement les paramètres souhaités pour la méthode format:

momentObj.format("YYYY-MM-DD HH:mm:ss")

En ce qui concerne les dernières lignes de votre code - lorsque vous revenez à un objet Date à l'aide de toDate(), vous abandonnez le comportement de moment.js et vous revenez au comportement de JavaScript. Un objet JavaScript Date sera toujours imprimé dans le fuseau horaire local de l'ordinateur sur lequel il est exécuté. Il n'y a rien momentané. Je peux faire à ce sujet.

Quelques autres petites choses:

  • Bien que le constructeur du moment puisse prendre une Date, il est généralement préférable de ne pas en utiliser une. Pour "maintenant", n'utilisez pas moment(new Date()). Au lieu de cela, utilisez simplement moment(). Les deux vont fonctionner mais c'est redondant inutilement. Si vous analysez une chaîne, transmettez-la directement à moment. N'essayez pas de commencer par analyser une variable Date. Vous constaterez que l'analyseur du moment sera beaucoup plus fiable.

  • Les fuseaux horaires tels que MST7MDT existent pour des raisons de compatibilité avec les versions antérieures. Ils proviennent des fuseaux horaires de style POSIX et seuls quelques-uns d'entre eux se trouvent dans les données TZDB. À moins que cela ne soit absolument nécessaire, vous devez utiliser une clé telle que America/Denver.

41
Matt Johnson

.toDate n'a pas vraiment fonctionné pour moi, alors, 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 t'aides

18
Mawaheb

J'avais besoin d'informations de fuseau horaire dans ma chaîne de date. J'utilisais à l'origine moment.tz(dateStr, 'America/New_York').toString();, mais j'ai ensuite commencé à avoir des erreurs concernant le chargement de cette chaîne dans l'instant.

J'ai essayé le moment.tz(dateStr, 'America/New_York').toDate(); mais ensuite j'ai perdu l'information de fuseau horaire dont j'avais besoin.

La seule solution qui renvoyait une chaîne de date utilisable avec un fuseau horaire pouvant être renvoyé dans moment était moment.tz(dateStr, 'America/New_York').format();

4
chovy

Depuis momentjs n'a aucun contrôle sur l'objet date javascript, j'ai trouvé un moyen de contourner ce problème. 

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

Cela vous donnera un objet date javascript avec l'heure convertie 

3
Yasith Prabuddhaka

moment a mis à jour la librairie js au 06/2018. 

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

si vous êtes libre d'utiliser Angular5 +, il vaut mieux utiliser la fonction datePipe que la fonction de fuseau horaire ici. Je dois utiliser moment.js car mon projet se limite à Angular2.

2
Feng Zhang
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

Agréable et propre!!!! 

0
Emerson Bottero

essayer (sans format étape)

new Date(moment())
var d = moment.tz("2019-04-15 12:00", "America/New_York");

console.log( new Date(d) );
console.log( new Date(moment()) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data.min.js"></script>
0
Kamil Kiełczewski