Pergunta

O script a seguir retorna 20 em vez de 21!

var d = new Date("2010/03/21");
document.write(d.getDate());

O que estou fazendo errado? Este é um bug javascript?

Foi útil?

Solução

o Date.parse O método é dependente da implementação (new Date(string) é equivalente a Date.parse(string)).

Embora esse formato esteja disponível nos navegadores modernos, você não pode ter 100% de certeza de que o navegador interpretará exatamente o formato desejado.

Eu recomendaria que você manipule sua corda e use o construtor de data com os argumentos do ano, mês e dia:

// parse a date in yyyy-mm-dd format
function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
}

Outras dicas

É uma questão de horário de verão, porque Encontro() usa horário local.

Eu moro no Brasil e outubro-21-2012 é o início do horário de verão na maior parte do meu país; portanto, as datas locais de 21 a 2012 entre 0: 0 e 1: 0 não existem no Brasil!

Algumas pessoas comentam aqui que funciona. Isso acontece porque o retorno da hora certa ou errada depende do país de usuário local.

Ver: http://www.timeanddate.com/news/time/brazil-dst-2012.html

No Brasil, em 2012, o Java acha que o DST começa em 14 de outubro (na verdade, começa 1 semana depois)

var dt = new Date(2012,9,14); 
alert(dt.getHours());

produz 1 e

Ver: http://www.timeanddate.com/time/dst/2013.html

A solução é o tempo de uso do UTC (tempo universal coordenado), porque não há alterações no horário de verão e você usa um tipo de tempo abstrato. Na maioria das aplicações práticas, não há problema.

var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12));
alert( (dt.getUTCMonth()+1) + '/' + dt.getUTCDate() + '/' + 
        dt.getUTCFullYear() + " " + dt.getUTCHours()+ ':' + 
        dt.getUTCMinutes() + ':' + dt.getUTCSeconds() );

É mais fácil se alguém não usar horas, minutos e segundos, basta colocar um valor de hora fictícia maior ou igual a 1, como mostrei acima.

Qualquer chance de estar tratando o argumento da string como UTC e o resultante Date Objeto como hora local, ou vice -versa? Isso pode jogar fora. Comparar d.getDate() para d.getUTCDate().

Eu também recebo um desvio de um dia getDate(), mas eu noto que getUTCDate() Retorna o valor esperado. O problema foi visto no FF 3.6.12, mas o mesmo código em execução no Chrome foi bom.

Meu código de depuração:

var date="2010-11-04";
alert(date);
var d = new Date(date)
alert(d.toDateString()+": "+ d.getDate()+" UTC "+d.getUTCDate());

Isso deu uma saída (Firefox):

Qua 03 de novembro de 2010: 3 UTC 4

Chrome está bem. Então, algo está em algum lugar - talvez um bug, mas provavelmente um problema de parâmetro de fuso horário/UTC. Me lembra de onde PHP date() Voltará 23 horas por dia se o fuso horário mudou naquele dia etc. Buggered, se eu souber o que é, no entanto.

Eu escrevi o seguinte código na barra de endereços do meu navegador e o resultado foi 21

javascript:alert(new Date("2010/03/21").getDate())

Não existe um bug javascript, pois existem muitas implementações de JavaScript, portanto, você deseja consultar uma implementação específica.

A implementação que testei foi o Chrome 4.1.249. O que é seu?

É o fuso horário que desempenha um papel importante aqui. o Date() A função adicionará seu fuso horário à data que você está dando como entrada. Por exemplo: eu dei a contribuição como esta:

alert(new Date("2018-09-15"));

O resultado para mim é: Sáb 15 de setembro de 2018 05:30:00 GMT+0530 (Hora padrão da Índia)

O fuso horário +05:30 é adicionado ao tempo da minha entrada (você pode ver no resultado acima. México, Chile, etc ... com fuso horário menor que 0], então ele adicionará à sua entrada de entrada (por exemplo: o fuso horário é UTC -05: 00. Ele subtrairá -5: 00 da data fornecida.

Vahidn, você tem o resultado 20 Porque você está no fuso horário menor que 0 (-1è :00`, etc ...)

A solução é Redefina seu fuso horário para 0. Assim:
Data ("2010-03-21T00: 00: 00").

Eu testei este código no Firefox 3.6 e ie 8:

<script type="text/javascript">

var d = new Date("2010/03/21");
document.write(d.getDate());

</script> 

Está mostrando a data certa: 21

Para mais informações, consulte: Objeto de data javascript

Você também pode ler sobre Considerações de compatibilidade de JavaScript na Wikipedia.

http://jsbin.com/aqoki3/edit - Aqui com código que você postou, eu recebo 21. Portanto, não é JS Bug. Talvez seja um bug na implementação do seu navegador (do JS).
Então, para iniciar corretamente sua data var use new Date(year, month, date [, hour, minute, second, millisecond ]) (https://developer.mozilla.org/en/core_javascript_1.5_reference/objects/date). Dessa forma, você terá certeza de que esse dia tem 21 anos, como você implicitamente o defina para 21.

Recebo a mesma data (21) em Firfox, Safari, Chrome, Opera e IE, se eu uso a string "2010/03/21" ou os argumentos da data inteira (2010,2,21).

Estou usando uma máquina Windows e novas versões dos navegadores-

Você pode testar se seu cliente analisa uma data diferente da string, que é o único lugar que vejo para um problema.

if(new Date("2010/03/21")- new Date(2010,2,21)){
alert(new Date("2010/03/21"));
} 

Certifique -se de que o mês número que você está usando é -1, se você estiver olhando em junho, precisa fazer (6-1) para o mês, quando criado

   var date_obj = new Date(y,(m-1),d);

Ao dar uma data de string à nova data, a string precisa incluir o fuso horário, caso contrário, será interpretada de maneira diferente do navegador para outros (devido a diferentes implementações de JavaScript) e da máquina para outra (devido à diferença do fuso horário local)

new Date('2017-07-31T10:00:00-0500');

ao invés de

new Date('2017-07-31T10:00:00');

Você não pode criar um objeto de data passando por um argumento de string mostra como a data.

Crie assim.

var str_date = "2010/03/21";
var date = new Date();
var date_elements = str_date.split("/");

date.setYear(date_elements[0]);
date.setMonth(date_elements[1]);
date.setDay(date_elements[2]);

alert(date.toString);

Dê atenção date.toString método. ele retorna a string de data completa.date.getDate Só te dará dia daquele dia.

Para obter mais informações do objeto de data, consulte www.w3school.com

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top