web-dev-qa-db-fra.com

MomentJS obtenant la date JavaScript en UTC

Je ne parviens pas à obtenir la chaîne de date JavaScript pour l'enregistrement MongoDB via les éléments suivants. Il continue à utiliser mon heure locale.

var utc = moment.utc().valueOf();
console.log(moment.utc(utc).toDate());

Sortie:

Tue Nov 11 2014 14:42:51 GMT-0500 (EST)

J'ai besoin que ce soit en UTC pour pouvoir coller cet horodatage en mongo afin que le type soit Date.

Comment puis je faire ça?

42
Cmag

Un horodatage est un point dans le temps. Typiquement, cela peut être représenté par un nombre de millisecondes après un epoc (Unix Epoc du 1er janvier 1970 à 12h00 UTC). Le format de ce moment dans le temps dépend du fuseau horaire. Même si c'est le même moment, la "valeur des heures" n'est pas la même entre les fuseaux horaires et il faut prendre en compte le décalage par rapport à UTC .

Voici du code à illustrer. Un point, le temps est capturé de trois manières différentes.

var moment = require( 'moment' );

var localDate = new Date();
var localMoment = moment();
var utcMoment = moment.utc();
var utcDate = new Date( utcMoment.format() );

//These are all the same
console.log( 'localData unix = ' + localDate.valueOf() );
console.log( 'localMoment unix = ' + localMoment.valueOf() );
console.log( 'utcMoment unix = ' + utcMoment.valueOf() );

//These formats are different
console.log( 'localDate = ' + localDate );
console.log( 'localMoment string = ' + localMoment.format() );
console.log( 'utcMoment string = ' + utcMoment.format() );
console.log( 'utcDate  = ' + utcDate );

//One to show conversion
console.log( 'localDate as UTC format = ' + moment.utc( localDate ).format() );
console.log( 'localDate as UTC unix = ' + moment.utc( localDate ).valueOf() );

Ce qui sort ceci:

localData unix = 1415806206570
localMoment unix = 1415806206570
utcMoment unix = 1415806206570
localDate = Wed Nov 12 2014 10:30:06 GMT-0500 (EST)
localMoment string = 2014-11-12T10:30:06-05:00
utcMoment string = 2014-11-12T15:30:06+00:00
utcDate  = Wed Nov 12 2014 10:30:06 GMT-0500 (EST)
localDate as UTC format = 2014-11-12T15:30:06+00:00
localDate as UTC unix = 1415806206570

En termes de millisecondes, ils sont identiques. C'est exactement le même moment (bien que dans certaines exécutions, la dernière milliseconde est supérieure).

En ce qui concerne le format, chacun peut être représenté dans un fuseau horaire particulier. Et la mise en forme de cette chaîne de fuseau horaire a un aspect différent, exactement au même moment!

Allez-vous comparer ces valeurs de temps? Il suffit de convertir en millisecondes. Une valeur en millisecondes est toujours inférieure, égale ou supérieure à une autre valeur en millisecondes.

Souhaitez-vous comparer des valeurs d’heure ou de jour spécifiques et craindre qu’elles ne viennent "de" différentes fuseaux horaires? Convertissez d'abord au format UTC en utilisant moment.utc( existingDate ), puis effectuez les opérations. Des exemples de ces conversions, à la sortie de la base de données, sont les derniers appels console.log De l'exemple.

62
clay

L'appel de toDate créera un copie (la documentation est erronée du fait que ce n'est pas une copie), de l'objet JS Date sous-jacent. L'objet JS Date est stocké au format UTC et sera toujours imprimé à l'heure est. Sans entrer dans le fait que .utc () modifie l'objet sous-jacent, le code ci-dessous est utilisé.

Vous n'avez pas besoin de moment pour cela.

new Date().getTime()

Cela fonctionne, car JS Date est en UTC depuis l’époque Unix. C'est extrêmement déroutant et je pense qu'il y a un gros défaut dans l'interface qui permet de mélanger des heures locales et des heures UTC comme celle-ci, sans description dans les méthodes.

6
Timothy Gonzalez

Ou simplement:

Date.now

De documentation MDN :

La méthode Date.now () renvoie le nombre de millisecondes écoulées depuis le 1er janvier 1970.

Disponible depuis ECMAScript 5.1

C'est la même chose que mentionnée ci-dessus (new Date().getTime()), mais version plus raccourcie.

0
av-k