Moment: Supprimer le fuseau horaire d'un objet moment.js

Créé le 4 déc. 2015  ·  3Commentaires  ·  Source: moment/moment

J'utilise datetimepicker.js et sa fonction date renvoie un objet moment.js . Il le fait avec le décalage UTC local et ma 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 de date et d'heure ( DD-MM HH:mm ):

01-10 15:00

Ce que j'obtiens :

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 pour n'importe quel UTC local? C'est sans avoir à supprimer manuellement le 01 (car il peut s'agir de tout autre décalage local en fonction de l'emplacement de l'utilisateur).

C'est ce que j'ai jusqu'à présent pour obtenir la date, mais je ne sais pas comment supprimer le décalage en gardant la même heure.

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

Commentaire le plus utile

const tmp = moment(valueAsDate).utc(true) - c'est ce dont vous avez besoin qui ignore le fuseau horaire
alors vous pouvez utiliser par exemple comme tmp.toISOString() .

Tous les 3 commentaires

Comme moment formatera la date d'origine pour qu'elle soit une date de fuseau horaire local. c'est-à-dire 2017-08-02 10:00:00+02:00 sera formaté pour être 2017-08-02 16:00:00+08:00 si le système de la machine utilise le fuseau horaire +08:00.

J'ai écrit une fonction pour formater la date d'origine en ignorant le fuseau horaire :

/**
 * <strong i="7">@desc</strong> use moment to format a datetime
 * <strong i="8">@param</strong> string|date|timestamp datetime: the datetime to format
   the given datetime can have timezone, and the timezone will be kept in the process of output datetime
   i.e. formate('2017-09-08 11:24:00+08:00', 'D/M/YYYY HH:mm:ss Z') =>  8/9/2017 11:24:00 +08:00, as you see, +08:00 is kept, which is different from moment default behavior
   if timezone has not been given, local timezone will be used.
 * <strong i="9">@param</strong> string formatter: the target format you want to get
 * <strong i="10">@param</strong> string givenFormatter: moment allow developer to define your own formatter, i.e. DD/MM/YYYY HH,mm,ss which is not a statndard time format
 * <strong i="11">@return</strong> string new formatted datetime string
 * <strong i="12">@example</strong>:
   1. format(new Date(), 'YYYY-MM-DD HH:mm:ss')
   2. format(your_date, 'YYYY-MM-DD HH:mm:ss', 'DD/MM/YYYY HH,mm,ss')
 */
export function format(datetime, formatter, givenFormatter) {
  let localTimezoneOffset = timezoneOffset()
  let givenTimezoneOffset = moment.parseZone(datetime).utcOffset()

  if (givenTimezoneOffset !== 0) {
    return moment(datetime, givenFormatter).utcOffset(givenTimezoneOffset).format(formatter)
  }
  else {
    // big problem: we do not know whether timezone has not been given or it is +00:00
    // if its utc time is the same with itself, it means timezone has been given
    let u = utc(datetime, 'YYYY-MM-DD HH:mm:ss')
    let t = moment(datetime).parseZone(datetime).format('YYYY-MM-DD HH:mm:ss')
    if (u === t) {
      return moment(datetime, givenFormatter).utc().format(formatter)
    }
    else {
      return moment(datetime).format(formatter)
    }
  }
}

Code source : https://github.com/tangshuang/moment-format

Utilisez cette fonction pour formater la date en ignorant la logique de format par défaut du moment. 2017-08-02 10:00:00+02:00 sera formaté comme 2017/08/02 10:00:00+02:00.

const tmp = moment(valueAsDate).utc(true) - c'est ce dont vous avez besoin qui ignore le fuseau horaire
alors vous pouvez utiliser par exemple comme tmp.toISOString() .

Cette page vous a été utile?
0 / 5 - 0 notes