Erro de análise de data de Javascript - falha para datas em junho (??)
Eu tenho algum javascript que analisa uma data ISO-8601. Por alguma razão, está falhando em datas em junho. Mas as datas em julho e maio funcionam bem, o que não faz sentido para mim. Espero que um novo conjunto de olhos ajude, porque não consigo ver o que estou fazendo de errado aqui.
Definição de função (com 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;
}
Código de testealert(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());
SaídaSáb, 09 de maio de 2009 12:30:00 GMTQui, 09Julho 2009 12:30:00 GMTQui, 09 de julho de 2009 12:30:00 GMTAtualizarObrigado pelas respostas rápidas, o problema foi que o objeto Date foi inicialmente hoje, que aconteceu em 31 de julho. Quando o mês foi definido para junho, antes de eu mudar o dia, ele estava temporariamente31 de junho, que foi antecipado para 1º de julho.
Desde então, descobri que o seguinte é uma implementação mais limpa, pois define todos os atributos de data de uma só 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;
}