web-dev-qa-db-fra.com

Mise à jour du décalage horaire avec moment (). UtcOffset ()

Je rencontre un problème en essayant d'utiliser moment.js pour gérer les décalages horaires.

Je collecte dans une entrée cachée le décalage horaire de l'utilisateur local:

<script type="text/javascript">
  $(document).ready(function () { 
    $('input#timeoffset').val(moment().utcOffset()); 
  });
</script>

Le décalage est correctement stocké (dans mon cas, sa valeur est -240). Plus tard sur le côté serveur (qui s'exécute en temps utc), j'essaie de mettre à jour certains utcDate stockés db en faisant quelque chose comme:

var userDate = moment(utcDate).utcOffset(offset)

Mon problème est le suivant: si j'exécute mon code comme décrit ci-dessus, je n'obtiens aucun effet:

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 012421 +0000

Si je retourne le signe de décalage, j'obtiens:

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 052421 +0400

Je fais clairement quelque chose de mal (même si je m'attendais à ce que la première version soit correcte), avez-vous un indice?

Côté client, j'utilise moment.js v2.10.6 tandis que côté serveur moment-timezone.js v0.4.0 et moment.js v2.10.6

16
Pierluigi

Le problème principal est que vous passez l'offset sous forme de chaîne au lieu d'un nombre.

moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ')
// "20151001 012421 +0000"

moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"

Lorsque vous avez un décalage en minutes, vous devez utiliser le formulaire numérique. Vous pouvez toujours le convertir:

moment.utc("2015-10-01 01:24:21").utcOffset(+"-240").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"

Moment autorise le passage des décalages sous forme de chaînes, mais il s'attend à ce qu'ils soient dans l'un des formats ISO8601: [+/-]HH:mm Ou [+/-]HHmm.

moment.utc("2015-10-01 01:24:21").utcOffset("-04:00").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"

De plus, notez que j'ai utilisé moment.utc(...) pour analyser la chaîne d'entrée. Vous venez d'utiliser moment(...) qui utilisera le fuseau horaire local sauf si le fuseau horaire est explicite ou si vous passez un objet Date au lieu d'une chaîne. Il laissera également l'objet moment en "mode local", donc votre sortie utcDate serait erronée à moins que le fuseau horaire de la machine ne soit réellement défini sur UTC.

Enfin, n'oubliez pas "Time Zone! = Offset". Vous ne pouvez pas supposer que le décalage obtenu est valable pour toutes les dates. Si vous devez projeter une date sur le fuseau horaire de l'utilisateur, vous devez en fait connaître le fuseau horaire, tel que America/New_York. Vous pouvez les utiliser avec le plugin moment-timezone.

23