Error de análisis de fecha de Javascript: falla en las fechas de junio (??)

Tengo algún javascript que analiza una fecha ISO-8601. Por alguna razón, está fallando para las fechas de junio. Pero las fechas en julio y mayo funcionan bien, lo que no tiene sentido para mí. Espero que un nuevo par de ojos ayude, porque no puedo ver lo que estoy haciendo mal aquí.

Definición de la función (con error)
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;
}
Código de prueba
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());
SalidaSáb, 09 de mayo 2009 12:30:00 GMTJue 09jul 2009 12:30:00 GMTJue, 09 jul 2009 12:30:00 GMTActualizar

Gracias por las respuestas rápidas, el problema fue que el objeto Fecha fue inicialmente el día de hoy, que resultó ser el 31 de julio. Cuando el mes se estableció en junio, antes de que cambiara el día, fue temporalmente31 de junio, que se adelantó al 1 de julio.

Desde entonces he encontrado que lo siguiente es una implementación más limpia, ya que establece todos los atributos de fecha a la vez:

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

Respuestas a la pregunta(5)

Su respuesta a la pregunta