Błąd analizy daty w JavaScript - nie udaje się na daty w czerwcu (??)

Mam javascript, który analizuje datę ISO-8601. Z jakiegoś powodu nie działa w czerwcu. Ale daty w lipcu i maju działają dobrze, co nie ma dla mnie sensu. Mam nadzieję, że nowy zestaw oczu pomoże, bo nie widzę, co tu źle robię.

Definicja funkcji (z błędem)
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;
}
Kod testowy
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());
WydajnośćSob, 09 maja 2009 12:30:00 GMTCzw. 09Lip 2009 12:30:00 GMTCzw, 09 lipca 2009 12:30:00 GMTAktualizacja

Dzięki za szybkie odpowiedzi, problem polegał na tym, że obiekt Date był początkowo dzisiaj, co było 31 lipca. Kiedy miesiąc był ustawiony na czerwiec, zanim zmieniłem dzień, był tymczasowo31 czerwca, który został przeniesiony do 1 lipca.

Od tego czasu uważam, że następująca procedura jest czystsza, ponieważ ustawia wszystkie atrybuty daty jednocześnie:

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;
}

questionAnswers(5)

yourAnswerToTheQuestion