2013-07-02 14 views
57

Ziel: Suchen Sie die local time und UTC time offset dann erstellen Sie die URL im folgenden Format.Wie formatiert ISO 8601 ein Datum mit Zeitzonenverschiebung in JavaScript?

Beispiel URL:?/Aktionen/Schlafdauer = 2002-10-10T12: 00: 00-05: 00

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

Die Dokumentation sagt:

For example, 2002-10-10T12:00:00−05:00 (noon on 10 October 2002, 
Central Daylight Savings Time as well as Eastern Standard Time in the U.S.) 
is equal to 2002-10-10T17:00:00Z, five hours later than 2002-10-10T12:00:00Z. 

So basiert auf meinem Verständnis, ich brauche meine Ortszeit durch new Date() dann verwenden getTimezoneOffset() Funktion zur Berechnung der Differenz dann fügen sie es bis zum Ende der Zeichenfolge zu finden.

1.Get Ortszeit mit Format

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

Ausgang

2013-07-02T09:00:00 

2.Get UTC Zeitversatz von Stunde

var offset = local.getTimezoneOffset()/60; 

Ausgang

7 

3.Construct URL (Zeit Teil nur)

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

Ausgang:

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

Das obige Ausgabemittel meiner Ortszeit ist 2013.07.02 09.00 Uhr und Differenz aus UTC ist 7 Stunden (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 so einem Fall aussehen sollte, weil ich nicht aus dem W3C-Dokument herausfinden kann. Danke im Voraus.

Antwort

98

Die unten sollte ordnungsgemäß funktionieren, und für alle Browser (dank @MattJohnson für die Spitze)

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());

+0

Sie sagen, dass ich Pluszeichen verwenden kann, wenn von getTimezoneOffset() wie 2013-07-02T09: 00: 00 + 2: 00 ein negativer Wert (-120) zurückgegeben wird? –

+0

Ja, das ist richtig. –

+2

Das Zeichen zeigt den Versatz der Ortszeit von GMT –

50

getTimezoneOffset() kehrt das entgegengesetzte Vorzeichen des Formats von der Spezifikation, dass Sie verpflichtet verwiesen.

Dieses Format ist auch bekannt als ISO8601 oder genauer als RFC3339.

In diesem Format wird UTC mit einem Z dargestellt, während alle anderen Formate durch einen Offset von UTC dargestellt werden. Die Bedeutung ist die gleiche wie bei JavaScript, aber die Reihenfolge der Subtraktion ist umgekehrt, so dass das Ergebnis das umgekehrte Vorzeichen hat.

Außerdem gibt es keine Methode für das native Date-Objekt mit der Bezeichnung format, sodass Ihre Funktion in Nr. 1 fehlschlägt, es sei denn, Sie verwenden eine Bibliothek, um dies zu erreichen. Siehe this documentation. Wenn Sie eine Bibliothek suchen, die direkt mit diesem Format arbeiten kann, empfehle ich Ihnen, moment.js. In der Tat ist dies das Standardformat, so können Sie dies einfach tun:

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 gut getestete, Cross-Browser-Lösung und hat viele andere nützliche Funktionen.

+2

+1 Danke für die Kompatibilität Link :) –

+1

+1 für viele gute Informationen –

+0

Verwenden toISOString() wird nicht funktionieren. Das Format +01: 00 benötigt den Zeitteil Ortszeit. toISOString() würde eine UTC-Zeit-Zeichenfolge geben. –

Verwandte Themen