Javascript Date Parsing Bug - Fehler bei Datumsangaben im Juni (??)

Ich habe ein Javascript, das ein ISO-8601-Datum analysiert. Aus irgendeinem Grund schlägt es für Daten im Juni fehl. Aber Daten im Juli und Mai funktionieren gut, was für mich keinen Sinn ergibt. Ich hoffe, neue Augen helfen, denn ich kann nicht sehen, was ich hier falsch mache.

Funktionsdefinition (mit Fehler)
function parseISO8601(timestamp)
{
  var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$");
  var matches = regex.exec(timestamp);
  if(matches != null)
  {
    var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10);
    if(matches[7] == "-")
      offset = -offset;

    var date = new Date();
    date.setUTCFullYear(parseInt(matches[1], 10));
    date.setUTCMonth(parseInt(matches[2], 10) - 1); //UPDATE - this is wrong
    date.setUTCDate(parseInt(matches[3], 10));
    date.setUTCHours(parseInt(matches[4], 10));
    date.setUTCMinutes(parseInt(matches[5], 10) - offset);
    date.setUTCSeconds(parseInt(matches[6], 10));
    date.setUTCMilliseconds(0);

    return date;
  }
  return null;
}
Code testen
alert(parseISO8601('2009-05-09T12:30:00-00:00').toUTCString());
alert(parseISO8601('2009-06-09T12:30:00-00:00').toUTCString());
alert(parseISO8601('2009-07-09T12:30:00-00:00').toUTCString());
AusgabeSa, 09. Mai 2009 12:30:00 GMTDo, 09Jul 2009 12:30:00 GMTDo, 09.07.2009 12:30:00 GMTAktualisieren

Vielen Dank für die schnellen Antworten. Das Problem bestand darin, dass sich das Datumsobjekt ursprünglich heute befand, also am 31. Juli. Als der Monat auf Juni eingestellt war, bevor ich den Tag änderte, war er vorübergehend31. Juni, die zum 1. Juli gerollt wurde.

Ich habe seitdem festgestellt, dass das Folgende eine sauberere Implementierung ist, da alle Datumsattribute auf einmal festgelegt werden:

function parseISO8601(timestamp)
{
  var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$");
  var matches = regex.exec(timestamp);
  if(matches != null)
  {
    var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10);
    if(matches[7] == "-")
      offset = -offset;

    return new Date(
      Date.UTC(
        parseInt(matches[1], 10),
        parseInt(matches[2], 10) - 1,
        parseInt(matches[3], 10),
        parseInt(matches[4], 10),
        parseInt(matches[5], 10),
        parseInt(matches[6], 10)
      ) - offset*60*1000
    );
  }
  return null;
}

Antworten auf die Frage(5)

Ihre Antwort auf die Frage