Por que Javascript getYear () retorna 108?

95

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?

ctrlShiftBryan
fonte
29
Oh, os pecados que cometemos ao tentar passar pelo Y2K.
DGentry
3
year = myDate.getFullYear() % 100;
Andrew Larsson

Respostas:

128

É 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.

ConroyP
fonte
25

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
FlySwat
fonte
7
Talvez smth como Date.prototype.getRealYear = Date.prototype.getFullYear? Date.prototype.getFullYear: function () {return this.getYear () + 1900; };
Valentin Golev
12

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.

skiphoppy
fonte
1
hehe ... me lembra do desenho animado Dilbert ... "você leu a história de um espanhol chamado Manual?" ;)
Adhip Gupta de
Acredito que @skiphoppy significava adicionar 1900 a getYear () para produzir o ano completo desejado. É semelhante a adicionar +1 a getMonth () ao recuperar o número legível do mês. Exemplo: var ts = new Date (); var fullYear = (ts.getYear () + 1900); Mas é preferível usar getFullYear (). Exemplo: var fullYear = new Date (). GetFullYear ();
recursiva de
6

Deve retornar o número de anos desde o ano de 1900.

Jeremy Ruten
fonte
4

usar date.getFullYear().

Isto é (como corretamente apontado em outro lugar) é uma coisa Y2K. Netscape (escrito antes de 2000) retornou originalmente, por exemplo, 98de getYear(). Em vez de retornar 00, ele retornou 100para 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 getFullYearcomo método padrão para retornar o ano completo.

Dan
fonte
3

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!

john
fonte
A razão pela qual a linguagem (Perl) não levou em consideração isso é porque ela estava copiando cegamente uma decisão de design C que havia sido feita muito antes. (20 anos?)
skiphoppy
Eu estava jogando sombra no JavaScript, não no Perl. O Perl freqüentemente expõe as rotinas C subjacentes de maneira bastante direta. Como você disse, é um produto de seu tempo. JS, projetado pelo menos uma década depois, poderia ter seguido um caminho diferente.
jjohn
2

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());
Arve
fonte
1

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.

joelhardi
fonte
1

Estou usando date.getUTCFullYear(); trabalhando sem problemas.

D3vito
fonte
0

O número que você obtém é o número de anos desde 1900. Não me pergunte por quê ..

Nils Pipenbrinck
fonte
0

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.

user11318
fonte
0

BTW, navegadores diferentes podem retornar resultados diferentes, então é melhor pular essa função e usar getFullYear () sempre.

Milan Babuškov
fonte
0

var date_object = new Date (); var ano = date_object.getYear (); if (ano <2000) {ano = ano + 1900; } // você terá o ano inteiro ....


fonte
-1

ele está retornando ao ano de 4 dígitos - 1900, o que pode ter sido legal há mais de 9 anos, mas é bem retardado agora. Java.util.Date do Java também faz isso.

user17163
fonte