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?


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.


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

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.


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


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.


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!


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());


1

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


0

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


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.


0

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


0

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.