web-dev-qa-db-fra.com

Même date dans un fuseau horaire différent

Ma question est de savoir comment obtenir le même jour, mois, année, heure, minutes, secondes dans un fuseau horaire différent, par exemple:

var now = moment().valueOf();
var result1 = moment(now).format('DD-MM-YYYY HH:mm:SS Z');

Dans mon fuseau horaire, j'obtiens ceci comme ceci:

18-02-2015 21:08:34 +01:00

Alors, comment puis-je changer uniquement le fuseau horaire sans changer d'autres valeurs (jours, mois, ..., minutes, ...)

Je veux obtenir quelque chose comme ça:

    result2: 18-02-2015 21:08:34 +01:00
    result3: 18-02-2015 21:08:34 +10:00
    result4: 18-02-2015 21:08:34 +05:00
    result5: 18-02-2015 21:08:34 -06:00
    result6: 18-02-2015 21:08:34 -11:00

Merci d'avance

32
Zouhair

Voici comment vous pourriez faire ce que vous demandez:

// get a moment representing the current time
var now = moment();

// create a new moment based on the original one
var another = now.clone();

// change the offset of the new moment - passing true to keep the local time
another.utcOffset('+05:30', true);

// log the output
console.log(now.format());      // "2016-01-15T11:58:07-08:00"
console.log(another.format());  // "2016-01-15T11:58:07+05:30"

Cependant, vous devez reconnaître deux choses importantes:

  • L'objet another ne représente plus l'heure actuelle - même dans le fuseau horaire cible. C'est un complètement différent moment. (Le monde ne synchronise pas les horloges locales. Si c'était le cas, nous n'aurions pas besoin de fuseaux horaires!).

    Pour cette raison, même si le code ci-dessus répond à la question posée, je déconseille fortement de l'utiliser . Réévaluez plutôt vos besoins, car il est probable qu'ils comprennent mal la nature de l'heure et des fuseaux horaires.

  • Un fuseau horaire ne peut pas être entièrement représenté par un décalage seul. Lisez "Time Zone! = Offset" dans le wiki de la balise de fuseau horaire . Alors que certains fuseaux horaires ont des décalages fixes (tels que +05: 30 utilisé par l'Inde), de nombreux fuseaux horaires modifient leurs décalages à différents moments de l'année pour s'adapter à heure d'été .

  • Si vous voulez en tenir compte, vous pouvez utiliser moment-timezone au lieu d'appeler utcOffset(...). Cependant, le problème dans ma première puce s'appliquerait toujours.

// get a moment representing the current time
var now = moment();

// create a new moment based on the original one
var another = now.clone();

// change the time zone of the new moment - passing true to keep the local time
another.tz('America/New_York', true); // or whatever time zone you desire

// log the output
console.log(now.format());      // "2016-01-15T11:58:07-08:00"
console.log(another.format());  // "2016-01-15T11:58:07-05:00"
55
Matt Johnson-Pint

La réponse la plus votée est l'OMI en désordre. Voici une solution plus propre - similaire à la réponse de BlueSam, mais plus sûre:

const myTime = moment.tz('2016-08-30T22:00:00', moment.ISO_8601, 'America/Denver')

myTime.format() //2016-08-30T22:00:00-06:00

const sameTimeDifferentZone = moment.tz(myTime.format('YYYY-MM-DDTHH:mm:ss.SSS'), moment.ISO_8601, 'America/New_York')

sameTimeDifferentZone.format() //2016-08-30T22:00:00-04:00
9
Joao

Après avoir lu les commentaires ci-dessus, j'ai pensé ajouter quelque chose en fonction de la réponse de Joao. Dans mon cas, j'essayais d'utiliser une date de moment préexistante avec un fuseau horaire et de la convertir en un autre fuseau horaire tout en conservant la valeur de date d'origine (comme demandé dans la question).

var newTimezone = 'America/Denver';

//date - contains existing moment with timezone i.e 'America/New_York'
moment.tz(date.format('YYYY-MM-DDTHH:mm:ss'), 'YYYY-MM-DDTHH:mm:ss', newTimezone);
5
Stefan Savu

À partir du moment docs: http://momentjs.com/timezone/docs/

référence moment-timezone-with-data.js et spécifiez le fuseau horaire où aller, comme ceci:

moment(date).tz("America/Los_Angeles").format()
2
BlueSam