Moment: Zeitzone aus einem moment.js-Objekt entfernen

Erstellt am 4. Dez. 2015  ·  3Kommentare  ·  Quelle: moment/moment

Ich verwende datetimepicker.js und seine Funktion date gibt ein moment.js- Objekt zurück. Dies geschieht mit dem lokalen UTC-Offset und mein ursprüngliches Datum hat einen anderen Offset.

Mein ursprüngliches Datum:

2015-10-01T15:00:00.000Z

Was ich in der Datums- und Uhrzeitauswahl ( DD-MM HH:mm ) anzeige:

01-10 15:00

Was ich bekomme:

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

Was ich will:

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

Beachten Sie, wie ich den +01-Offset am Ende entfernt habe.

Wie kann ich dies tun, indem ich es für eine beliebige lokale UTC anwende? Dies ist, ohne dass 01 manuell entfernt werden muss (da es je nach Standort des Benutzers ein beliebiger anderer lokaler Offset sein kann).

Dies ist, was ich bisher habe, um das Datum zu erhalten, aber ich weiß nicht, wie ich den Offset entfernen kann, indem ich die gleiche Zeit beibehalte.

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

Hilfreichster Kommentar

const tmp = moment(valueAsDate).utc(true) - das ist, was Sie brauchen, das die Zeitzone ignoriert
dann können Sie zum Beispiel als tmp.toISOString() verwenden.

Alle 3 Kommentare

Als Moment wird das ursprüngliche Datum als lokales Zeitzonendatum formatiert. dh 2017-08-02 10:00:00+02:00 wird als 2017-08-02 16:00:00+08:00 formatiert, wenn das Maschinensystem die Zeitzone +08:00 verwendet.

Ich habe eine Funktion geschrieben, um das ursprüngliche Datum zu formatieren und dabei die Zeitzone zu ignorieren:

/**
 * <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)
    }
  }
}

Quellcode: https://github.com/tangshuang/moment-format

Verwenden Sie diese Funktion, um das Datum zu formatieren, ignorieren Sie die Standardformatlogik des Moments. 2017-08-02 10:00:00+02:00 wird wie 2017/08/02 10:00:00+02:00 formatiert.

const tmp = moment(valueAsDate).utc(true) - das ist, was Sie brauchen, das die Zeitzone ignoriert
dann können Sie zum Beispiel als tmp.toISOString() verwenden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen