it-swarm.com.de

Wie formatiere ich ein Datum nach ISO 8601 mit Zeitzonenversatz in JavaScript?

Ziel: Finde das local time und UTC time offset dann konstruiere die URL in folgendem Format.

Beispiel-URL:/Actions/Sleep? Duration = 2002-10-10T12: 00: 00−05: 00

Das Format basiert auf der W3C-Empfehlung: http://www.w3.org/TR/xmlschema11-2/#dateTime

In der Dokumentation heißt es:

Beispiel: 2002-10-10T12: 00: 00−05: 00 (mittags am 10. Oktober 2002, zentrale Sommerzeit sowie Eastern Standard Time in den USA) entspricht 2002-10-10T17: 00: 00Z. fünf Stunden später als 2002-10-10T12: 00: 00Z.

Nach meinem Verständnis muss ich meine Ortszeit anhand von new Date () ermitteln und dann die Funktion getTimezoneOffset () verwenden, um die Differenz zu berechnen. Anschließend muss ich sie an das Ende der Zeichenfolge anhängen.

1. Holen Sie sich die Ortszeit mit Format

var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)

Ausgabe

2013-07-02T09:00:00

2.Holen Sie sich die UTC-Zeit um eine Stunde versetzt

var offset = local.getTimezoneOffset() / 60;

Ausgabe

7

3. URL erstellen (nur Zeitteil)

var duration = local + "-" + offset + ":00";

Ausgabe:

2013-07-02T09:00:00-7:00

Die obige Ausgabe bedeutet, dass meine Ortszeit am 02.07.2013 um 9 Uhr morgens ist und die Differenz zur UTC 7 Stunden beträgt (UTC ist 7 Stunden vor der Ortszeit).

Bisher scheint es zu funktionieren, aber was ist, wenn getTimezoneOffset () einen negativen Wert wie -120 zurückgibt?

Ich frage mich, wie das Format in einem solchen Fall aussehen soll, weil ich aus dem W3C-Dokument nichts herausfinden kann. Danke im Voraus.

83
masato-san

Das Folgende sollte korrekt funktionieren und für alle Browser (danke an @MattJohnson für den Tipp)

Date.prototype.toIsoString = function() {
    var tzo = -this.getTimezoneOffset(),
        dif = tzo >= 0 ? '+' : '-',
        pad = function(num) {
            var norm = Math.floor(Math.abs(num));
            return (norm < 10 ? '0' : '') + norm;
        };
    return this.getFullYear() +
        '-' + pad(this.getMonth() + 1) +
        '-' + pad(this.getDate()) +
        'T' + pad(this.getHours()) +
        ':' + pad(this.getMinutes()) +
        ':' + pad(this.getSeconds()) +
        dif + pad(tzo / 60) +
        ':' + pad(tzo % 60);
}

var dt = new Date();
console.log(dt.toIsoString());
149
Steven Moseley

getTimezoneOffset() gibt das entgegengesetzte Vorzeichen des Formats zurück, das für die von Ihnen angegebene Spezifikation erforderlich ist.

Dieses Format wird auch als ISO8601 oder genauer als RFC3339 bezeichnet.

In diesem Format wird UTC mit einem Z dargestellt, während alle anderen Formate durch einen Versatz von UTC dargestellt werden. Die Bedeutung ist dieselbe wie bei JavaScript, aber die Reihenfolge der Subtraktion ist invertiert, sodass das Ergebnis das entgegengesetzte Vorzeichen trägt.

Außerdem gibt es keine Methode für das native Date -Objekt mit dem Namen format, sodass Ihre Funktion in # 1 fehlschlägt, es sei denn, Sie verwenden eine Bibliothek, um dies zu erreichen. Siehe diese Dokumentation .

Wenn Sie eine Bibliothek suchen, die direkt mit diesem Format arbeiten kann, empfehle ich moment.js . Tatsächlich ist dies das Standardformat, so dass Sie dies einfach tun können:

var m = moment();    // get "now" as a moment
var s = m.format();  // the ISO format is the default so no parameters are needed

// sample output:   2013-07-01T17:55:13-07:00

Dies ist eine bewährte, browserübergreifende Lösung mit vielen weiteren nützlichen Funktionen.

62

Dies ist meine Funktion für die Zeitzone des Kunden, es ist leicht und einfach

  function getCurrentDateTimeMySql() {        
      var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
      var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, 19).replace('T', ' ');
      var mySqlDT = localISOTime;
      return mySqlDT;
  }
2
Bbb

Überprüfen Sie dies:

function dateToLocalISO(date) {
    const off    = date.getTimezoneOffset()
    const absoff = Math.abs(off)
    return (new Date(date.getTime() - off*60*1000).toISOString().substr(0,23) +
            (off > 0 ? '-' : '+') + 
            (absoff / 60).toFixed(0).padStart(2,'0') + ':' + 
            (absoff % 60).toString().padStart(2,'0'))
}

// Test it:
d = new Date()

dateToLocalISO(d)
// ==> '2019-06-21T16:07:22.181-03:00'

// Is similar to:

moment = require('moment')
moment(d).format('YYYY-MM-DDTHH:mm:ss.SSSZ') 
// ==> '2019-06-21T16:07:22.181-03:00'
0
Nahuel Greco

Nur meine beiden senden hier

Ich habe dieses Problem mit Datumsangaben konfrontiert und Folgendes getan:

const moment = require('moment-timezone')

const date = moment.tz('America/Bogota').format()

Speichern Sie dann das Datum in db, um es mit einer Abfrage vergleichen zu können.


Installieren moment-timezone

npm i moment-timezone
0