Ошибка разбора даты в Javascript - не работает для дат в июне (??)

У меня есть некоторый JavaScript, который анализирует дату ISO-8601. По некоторым причинам, это не подходит для дат в июне. Но даты в июле и мае работают нормально, что не имеет смысла для меня. Я надеюсь, что новый взгляд поможет, потому что я не вижу, что я делаю здесь неправильно.

Function definition (with bug)
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;
}
Test code
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());
Output Sat, 09 May 2009 12:30:00 GMT Thu, 09 Jul 2009 12:30:00 GMT Thu, 09 Jul 2009 12:30:00 GMT Update

Спасибо за быстрые ответы, проблема была в том, что объект Date изначально был сегодня, а это было 31 июля. Когда месяц был установлен на июнь, до того как я изменил день, он был временноJune 31, который был перенесен на 1 июля.

С тех пор я обнаружил, что следующее является более чистой реализацией, поскольку оно устанавливает все атрибуты даты одновременно:

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

Ответы на вопрос(5)

Ваш ответ на вопрос