Javascript GetDate retorna data errada
-
21-09-2019 - |
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?
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