Ziel: Ermitteln Sie die "Ortszeit" und den "UTC-Zeitversatz" und erstellen Sie dann die URL im folgenden 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
Die Dokumentation sagt:
Zum Beispiel, 2002-10-10T12:00:00-05:00 (Mittag am 10. Oktober 2002, Central Daylight Savings Time sowie Eastern Standard Time in den U.S.A.) ist gleich 2002-10-10T17:00:00Z, fünf Stunden später als 2002-10-10T12:00:00Z.
Nach meinem Verständnis muss ich also meine Ortszeit mit new Date() ermitteln und dann die Funktion getTimezoneOffset() verwenden, um die Differenz zu berechnen und sie dann an das Ende der Zeichenfolge anzuhängen.
var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)
Ausgabe
2013-07-02T09:00:00
var offset = local.getTimezoneOffset() / 60;
Ausgabe
7
3.Construct URL (nur Zeitteil)
var duration = local + "-" + offset + ":00";
Ausgabe:
2013-07-02T09:00:00-7:00
Die obige Ausgabe bedeutet, dass meine Ortszeit 2013/07/02 9 Uhr ist und die Differenz zur UTC 7 Stunden beträgt (UTC ist der Ortszeit 7 Stunden voraus)
So weit 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 sollte, weil ich aus dem W3C-Dokument nichts herausfinden kann. Vielen Dank im Voraus.
Der folgende Text sollte bei allen Browsern funktionieren (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());
getTimezoneOffset()" gibt das umgekehrte Vorzeichen des Formats zurück, das in der von Ihnen referenzierten Spezifikation verlangt wird.
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 in JavaScript, aber die Reihenfolge der Subtraktion ist umgekehrt, so dass das Ergebnis das umgekehrte Vorzeichen trägt.
Außerdem gibt es für das native Date
-Objekt keine Methode namens format
, so dass Ihre Funktion in #1 fehlschlagen wird, 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 gut getestete, browserübergreifende Lösung und hat viele andere nützliche Funktionen.
Dies ist meine Funktion für die Kunden Zeitzone, 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;
}