9 Stimmen

Konvertiere yyyy-MM-ddTHH:mm:ss.fffZ manuell in JavaScript in ein DateTime

Ich erhalte von einem Webservice einen String mit einem Datum im folgenden Format:

yyyy-MM-ddTHH:mm:ss.fffZ

Ich muss diesen String mit JavaScript in ein normales Datum umwandeln, jedoch ohne die neue Date('yyyy-MM-ddTHH:mm:ss.fffZ') zu verwenden, da ich eine alte Version von JavaScript benutze, die diese Konvertierung nicht unterstützt. Ich kann den String aufteilen und das Folgende erhalten:

  • Jahr
  • Monat
  • Tage
  • Zeit

aber wie manipuliere ich die Zeitzone "fffZ"? Irgendwelche Vorschläge?

10voto

Jan Jongboom Punkte 25470

Hier ist eine One-Liner von John Resig:

var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")),

5voto

Martín Punkte 3105

Ich habe die Lösung gefunden. Bitte überprüfen Sie http://webcloud.se/log/JavaScript-and-ISO-8601/

Date.prototype.setISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

0voto

Paul S. Punkte 61457

Wenn Sie wissen, dass es diese Form haben wird (ISO 8601, wiki), können Sie es mit RegExp oder String-Methoden analysieren. Hier ist ein RegExp-Beispiel, mit dem Sie die Zeitzone Z, +hh oder +hh:mm verwenden können.

var dateString = '2013-01-08T17:16:36.000Z';

var ISO_8601_re = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{3}))?(Z|[\+-]\d{2}(?::\d{2})?)$/,
    m = dateString .match(ISO_8601_re);

var year = +m[1],
    month = +m[2],
    dayOfMonth = +m[3],
    hour = +m[4],
    minute = +m[5],
    second = +m[6],
    ms = +m[7], // +'' === 0
    timezone = m[8];

if (timezone === 'Z') timezone = 0;
else timezone = timezone.split(':'), timezone = +(timezone[0][0]+'1') * (60*(+timezone[0].slice(1)) + (+timezone[1] || 0));
// timezone is now minutes

// your prefered way to construct
var myDate = new Date();
myDate.setUTCFullYear(year);
myDate.setUTCMonth(month - 1);
myDate.setUTCDate(dayOfMonth);
myDate.setUTCHours(hour);
myDate.setUTCMinutes(minute + timezone); // timezone offset set here, after hours
myDate.setUTCSeconds(second);
myDate.setUTCMilliseconds(ms);

console.log(myDate); // Tue Jan 08 2013 17:16:36 GMT+0000 (GMT Standard Time)

-3voto

Chasky Punkte 60

momentjs hat die Antwort auf dieses und viele andere Probleme mit Datumsangaben, die Sie haben könnten. Obwohl es nicht klar ist, wo und wie Sie das benötigte Datum verwenden werden, noch das gewünschte Format, denke ich, dass momentjs Ihnen bei einigen der benötigten Aufgaben helfen kann. Ich würde das Modul zu meiner Lösung hinzufügen und wie folgt verwenden (unten ist parse.com Cloud-Code):

Parse.Cloud.define("momentFormat", function(request, response){
    var message;

    var date = momento('2013-01-08T17:16:36.000Z');
    response.success("original format date: " + date.format("YYYY-MM-DDTHH:mm:ss.SSSZ") + " new format date: " + date.format("dddd, MMMM Do YYYY, h:mm:ss a"));
});

Ausgabe:

{"result":"original format date: 2013-01-08T17:16:36.000+00:00 neues Formatdatum: Dienstag, 8. Januar 2013, 17:16:36 Uhr"}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X