web-dev-qa-db-fra.com

Supprimer le fuseau horaire d'un objet moment.js

J'utilise datetimepicker.js et sa fonction date renvoie un moment.js object. C'est le cas avec le décalage UTC local et la date d'origine a un décalage différent.

Ma date d'origine:

2015-10-01T15:00:00.000Z

Ce que j’affiche sur le sélecteur d’heure date (DD-MM HH:mm):

01-10 15:00

Ce que je reçois:

2015-10-01T15:40:00+01:00

Ce que je veux:

2015-10-01T15:40:00+00:00

Notez comment j'ai supprimé le décalage +01 à la fin.

Comment puis-je faire cela en l'appliquant à n'importe quel UTC local? C'est sans avoir à supprimer manuellement le 01 (car il peut s'agir d'un autre décalage local en fonction de l'emplacement de l'utilisateur).

var momentDate = timePicker.data("DateTimePicker").date();
console.log(momentDate.format());
//this prints  2015-10-01T15:40:00+01:00
24
Alvaro

On dirait que vous essayez de demander à l'utilisateur de choisir une date et une heure basées sur l'heure UTC. Par conséquent, la meilleure solution consiste à faire en sorte que le sélecteur fonctionne en mode UTC dès le début. Je ne suis pas familier avec ce datetimepicker en particulier, mais en supposant que quelque part en interne, il fait quelque chose comme ceci:

var m = moment([year, month-1, day, hour, minute]);

Alors devrait plutôt faire ceci:

var m = moment.utc([year, month-1, day, hour, minute]);

(Les variables présentées ici proviendraient du contrôle de sélecteur.)

Idéalement, le contrôle de sélecteur devrait inclure une fonctionnalité permettant de définir le mode UTC afin de pouvoir le faire en interne, lorsque cela vous est demandé.

Si ce n'est pas le cas, vous pouvez toujours vous dédommager. Malheureusement, vous ne pouvez pas simplement appeler .utc(), car cela donnerait une heure différente de celle choisie par l'utilisateur. Vous devrez donc compenser en décalant l'heure UTC du décalage d'origine du moment.

var m = // moment value from the picker
var result = moment(m).utc().add(m.utcOffset(), 'm');

Vous pouvez ensuite appeler format ou celui que vous souhaitiez sur le résultat. Notez que le moment d'origine est cloné avec moment(m), de sorte que le décalage ne soit pas perdu et que le passage au format UTC n'interfère pas avec le comportement interne du sélecteur.

Notez également que shifting like est généralement un hack et que, s’il est mal fait, il peut entraîner des erreurs. Ici, tout va bien, car le moment est déjà en mode UTC lorsque le réglage est appliqué. Mais en tant que solution générale, les déplacements doivent être évités. La meilleure option consiste à commencer par placer le contrôle en mode UTC.

23
Matt Johnson

Vous devez spécifier explicitement le format.

Essaye ça:

momentDate.format('YYYY-MM-DDTHH:mm:ss')

cela donnera le résultat comme

2015-10-01T15: 40: 00

23
Matt

Essaye ça:

let str = '2015-10-01T15:40+01:00';
let moment = moment(str).utcOffset(str)
console.log(moment.format('DD/MM/YYYY HH:mm'))
<script src="https://momentjs.com/downloads/moment.js"></script>

2
Frofike

Cela a fonctionné pour moi:

let date = "2017-02-01 15:20:00.00";
let pattern = "YYYY-MM-DD HH:mm:ss.SS"
let d = moment(date, pattern).utc(false);

Il dira toujours qu'il a pris en compte le fuseau horaire, mais je trouve que ce n'est pas le cas.

LOG: 'ParseDateStr::2017-2-1 15:20:00.0000000
ParsedDate::Wed Feb 01 2017 15:20:00 GMT+0100 (Central European Standard Time)'

Normalement, avec seulement moment(date, pattern), il serait analysé en tant que 16:20:00

2
Wep0n

Pas une solution propre mais vous pourriez le faire 

momentDate.format('YYYY-MM-DDTHH:mm:ss') + '00:00';

Cela supprimerait le fuseau horaire et renverrait ensuite la partie '00: 00'. Cela prolongerait la réponse de Matt.

Ce qui vous donnerait 

2015-10-01T15: 40: 00 + 00: 00

2
Craig

le plus simple possible:

let str = "2018-03-20T16:29:35-03:00";
let res = str.substring(0, 19); //2018-03-20T16:29:35
let hi = moment(res).format('LLL')
console.log(hi) //20 de Março de 2018 às 16:29
0
Darlan Dieterich