Por que este javascript retorna 108 em vez de 2008? obtém o dia e o mês corretos, mas não o ano?
myDate = new Date();
year = myDate.getYear();
ano = 108?
year = myDate.getFullYear() % 100;
Por que este javascript retorna 108 em vez de 2008? obtém o dia e o mês corretos, mas não o ano?
myDate = new Date();
year = myDate.getYear();
ano = 108?
year = myDate.getFullYear() % 100;
Respostas:
É uma coisa do Y2K , apenas os anos desde 1900 são contados.
Existem possíveis problemas de compatibilidade agora que getYear()
foram substituídos por getFullYear()
- do modo quirks :
Para tornar o assunto ainda mais complexo, date.getYear () está obsoleto hoje em dia e você deve usar date.getFullYear (), que, por sua vez, não é compatível com os navegadores mais antigos. Se funcionar, no entanto, deve sempre fornecer o ano completo, ou seja. 2000 em vez de 100.
Seu navegador fornece os seguintes anos com estes dois métodos:
* The year according to getYear(): 108
* The year according to getFullYear(): 2008
Também há diferenças de implementação entre o Internet Explorer e o Firefox, já que a implementação do IE getYear()
foi alterada para se comportar como getFullYear()
- da IBM :
De acordo com a especificação ECMAScript, getYear retorna o ano menos 1900, originalmente destinado a retornar "98" para 1998. getYear foi descontinuado no ECMAScript Versão 3 e substituído por getFullYear ().
O Internet Explorer alterou getYear () para funcionar como getFullYear () e torná-lo compatível com o Y2k, enquanto o Mozilla manteve o comportamento padrão.
Como getFullYear não funciona em navegadores mais antigos, você pode usar algo assim:
Date.prototype.getRealYear = function()
{
if(this.getFullYear)
return this.getFullYear();
else
return this.getYear() + 1900;
};
O protótipo Javascript pode ser usado para estender objetos existentes, bem como métodos de extensão C #. Agora, podemos simplesmente fazer isso;
var myDate = new Date();
myDate.getRealYear();
// Outputs 2008
Verifique a documentação. Não é um problema do Y2K - é a falta de um problema do Y2K! Esta decisão foi tomada originalmente em C e foi copiada em Perl, aparentemente em JavaScript e provavelmente em várias outras linguagens. Isso, há muito tempo, aparentemente ainda parecia desejável usar anos de dois dígitos, mas, notavelmente, quem projetou essa interface teve bastante premeditação para perceber que precisava pensar sobre o que aconteceria no ano 2000 e além, então, em vez de apenas fornecer os dois últimos dígitos, eles forneciam o número de anos desde 1900. Você poderia usar os dois dígitos, se estivesse com pressa ou quisesse arriscar. Ou, se quiser que seu programa continue a funcionar, você pode adicionar 100 ao resultado e usar anos completos de quatro dígitos.
Lembro-me da primeira vez que fiz manipulação de datas em Perl. Estranhamente, li os documentos . Aparentemente, isso não é uma coisa comum. Um ou dois anos depois, fui chamado ao escritório em 31 de dezembro de 1999 para consertar um bug que havia sido descoberto no último minuto possível em algum código Perl de contrato, coisas com as quais eu nunca tive nada a ver. Era exatamente este o problema: a chamada de data padrão retornava anos desde 1900, e os programadores o tratavam como um ano de dois dígitos. (Eles presumiram que conseguiriam "00" em 2000.) Como um jovem programador inexperiente, fiquei espantado ao saber que havíamos pago tanto a mais por um trabalho "profissional", e aquelas pessoas nem mesmo se preocuparam em ler o documentação. Foi o início de muitos anos de desilusão; agora estou velho e cínico. :)
No ano 2000, a conferência anual YAPC Perl foi referida como "YAPC 19100" em homenagem a este não-bug freqüentemente relatado.
Hoje em dia, pelo menos no mundo Perl, faz mais sentido usar um módulo padrão para tratamento de datas, que usa anos reais de quatro dígitos. Não tenho certeza do que pode estar disponível para JavaScript.
Deve retornar o número de anos desde o ano de 1900.
usar date.getFullYear()
.
Isto é (como corretamente apontado em outro lugar) é uma coisa Y2K. Netscape (escrito antes de 2000) retornou originalmente, por exemplo, 98
de getYear()
. Em vez de retornar 00
, ele retornou 100
para o ano de 2000. Então, outros navegadores surgiram e fizeram isso de maneira diferente, e todos ficaram descontentes quando a incompatibilidade reinou.
Navegadores posteriores são suportados getFullYear
como método padrão para retornar o ano completo.
Essa pergunta é tão antiga que me faz chorar de saudade dos dias pontocom!
Isso mesmo, Date.getYear () retorna o número de anos desde 1900, assim como o localtime () do Perl. É de se perguntar por que uma linguagem projetada nos anos 1990 não seria responsável pela virada do século, mas o que posso dizer? Você tinha que estar lá. Isso fazia sentido na época (como o pets.com).
Antes de 2000, alguém poderia ficar tentado a corrigir esse bug acrescentando "19" ao resultado de getYear () resultando no "bug do ano 19100" . Outros já responderam a essa pergunta suficientemente (adicione 1900 ao resultado de getDate ()).
Talvez o livro que você está lendo sobre JavaScript seja um pouco antigo?
Obrigado pela explosão do passado!
Você deve, como apontado, nunca usar getYear()
, mas sim usar getFullYear()
.
A história, entretanto, não é tão simples quanto "o IE implementa GetYear()
como getFullYear()
. Opera e IE atualmente tratam getYear()
como getYear()
foi originalmente especificado para datas anteriores a 2000, mas tratá-lo-ão como getFullYear()
para datas posteriores a 2000, enquanto o webkit e o Firefox mantêm o comportamento antigo
Isso resulta em 99 em todos os navegadores:
javascript:alert(new Date(917823600000).getYear());
A saída é 108 no FF / WebKit e 2008 no Opera / IE:
javascript:alert(new Date().getYear());
Isso é idiota. Ele data de dias anteriores ao Y2K e agora retorna apenas o número de anos desde 1900 por motivos de legado. Use getFullYear () para obter o ano real.
O número que você obtém é o número de anos desde 1900. Não me pergunte por quê ..
Como outros disseram, ele retorna o número de anos desde 1900. O motivo disso é que, quando o JavaScript foi inventado em meados dos anos 90, esse comportamento era conveniente e consistente com APIs de data e hora em outras linguagens. Particularmente C. E, claro, depois que a API foi estabelecida, eles não puderam alterá-la por motivos de compatibilidade com versões anteriores.
BTW, navegadores diferentes podem retornar resultados diferentes, então é melhor pular essa função e usar getFullYear () sempre.
var date_object = new Date (); var ano = date_object.getYear (); if (ano <2000) {ano = ano + 1900; } // você terá o ano inteiro ....