Почему Javascript getYear () возвращает 108? - PullRequest
91 голосов
/ 19 сентября 2008

Почему этот JavaScript возвращает 108 вместо 2008? день и месяц верны, но не год?

myDate = new Date();
year = myDate.getYear();

год = 108?

Ответы [ 14 ]

125 голосов
/ 19 сентября 2008

Это вещь Y2K , считаются только годы с 1900 года.

Существуют потенциальные проблемы совместимости теперь, когда getYear() устарел в пользу getFullYear() - из quirksmode :

Чтобы еще больше усложнить задачу, date.getYear () в настоящее время устарела, и вам следует использовать date.getFullYear (), которая, в свою очередь, не поддерживается старыми браузерами. Если это работает, однако, это должно всегда давать полный год, т.е. 2000 вместо 100.

Ваш браузер дает следующие два года с помощью этих двух методов:

* The year according to getYear(): 108
* The year according to getFullYear(): 2008

Существуют также различия в реализации между Internet Explorer и Firefox, так как реализация IE getYear() была изменена, чтобы вести себя как getFullYear() - с IBM :

В соответствии со спецификацией ECMAScript getYear возвращает год минус 1900, изначально предназначенный для возврата «98» за 1998 год. GetYear устарел в ECMAScript версии 3 и заменен на getFullYear ().

Internet Explorer изменил getYear (), чтобы он работал как getFullYear () и сделал его совместимым с Y2k, в то время как Mozilla сохранила стандартное поведение.

24 голосов
/ 19 сентября 2008

Поскольку getFullYear не работает в старых браузерах, вы можете использовать что-то вроде этого:

Date.prototype.getRealYear = function() 
{ 
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900; 
};

Прототип Javascript может использоваться для расширения существующих объектов, так же, как методы расширения C #. Теперь мы можем просто сделать это;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008
10 голосов
/ 19 сентября 2008

Проверьте документы. Это не проблема Y2K - это проблема Y2K! Это решение было принято изначально на C и было скопировано в Perl, по-видимому, JavaScript и, возможно, в несколько других языков. Давным-давно было очевидно, что было желательно использовать двузначные годы, но, что удивительно, у того, кто разработал этот интерфейс, было достаточно предвидения, чтобы понять, что им нужно подумать о том, что произойдет в 2000 году и в последующий период, поэтому вместо предоставления двух последних цифры, они указали количество лет с 1900 года. Вы можете использовать две цифры, если вы спешите или хотите быть рискованными. Или, если вы хотите, чтобы ваша программа продолжала работать, вы можете добавить 100 к результату и использовать полноценные четырехзначные годы.

Я помню первый раз, когда я делал манипуляции с датами в Perl. Как ни странно, я прочитал документы . Видимо, это не обычное дело. Год или два спустя меня вызвали в офис 31 декабря 1999 года, чтобы исправить ошибку, которая была обнаружена в последнюю возможную минуту в контрактном коде Perl, и я никогда не имел к этому никакого отношения. Это была именно та проблема: стандартный вызов даты возвратил годы с 1900 года, и программисты рассматривали его как год с двумя цифрами. (Они предполагали, что получат «00» в 2000 году.) Как молодой неопытный программист, я не мог понять, что мы так много заплатили за «профессиональную» работу, и эти люди даже не удосужились прочитать документация. Это было начало многих лет разочарования; теперь я старый и циничный. :)

В 2000 году ежегодная конференция YAPC Perl была названа «YAPC 19100» в честь этого часто сообщаемого сообщения об ошибке.

В настоящее время, по крайней мере, в мире Perl имеет смысл использовать стандартный модуль для обработки дат, который использует реальные четырехзначные годы. Не уверен, что может быть доступно для JavaScript.

6 голосов
/ 19 сентября 2008

Должно возвращаться количество лет с 1900 года.

4 голосов
/ 19 сентября 2008

использовать date.getFullYear().

Это (как правильно указано в другом месте) - вещь 2000 года. Netscape (написанный до 2000 года) изначально возвращался, например 98 из getYear(). Вместо того, чтобы вернуться к 00, вместо 2000 он вернул 100. Затем появились другие браузеры и сделали это по-другому, и все были недовольны, поскольку царила несовместимость.

Более поздние браузеры поддерживали getFullYear в качестве стандартного метода возврата полного года.

2 голосов
/ 19 сентября 2008

Вы должны, как указано, никогда не использовать getYear(), а вместо этого использовать getFullYear().

Однако история не так проста, как "IE реализует GetYear() как getFullYear(). Opera и IE в наши дни воспринимают getYear() как getYear(), который изначально был указан для дат до 2000 года, но будет воспринимать его как getFullYear() для дат после 2000, в то время как webkit и Firefox придерживаются старого поведения

Это выводит 99 во всех браузерах:

javascript:alert(new Date(917823600000).getYear());

Это выводит 108 в FF / WebKit и 2008 в Opera / IE:

javascript:alert(new Date().getYear());
2 голосов
/ 19 сентября 2008

Этот вопрос настолько стар, что заставляет меня плакать от ностальгии по доткомам!

Правильно, Date.getYear () возвращает количество лет с 1900 года, точно так же, как Perl localtime (). Возникает вопрос, почему язык, разработанный в 1990-х годах, не учитывал оборот века, но что я могу сказать? Вы должны были быть там. В то время это имело некоторый смысл (как это делал pets.com).

До 2000 года можно было бы попытаться исправить эту ошибку, добавив «19» к результату getYear (), в результате чего «год 19100 ошибка» . Другие уже достаточно ответили на этот вопрос (добавьте 1900 к результату getDate ()).

Может быть, книга, которую вы читаете о JavaScript, немного старая?

Спасибо за взрыв из прошлого!

1 голос
/ 10 августа 2010

Я использую date.getUTCFullYear(); работает без проблем.

1 голос
/ 19 сентября 2008

Это глупо. Он датируется до 2000 дней , а теперь просто возвращает количество лет с 1900 года по старым причинам. Используйте getFullYear (), чтобы получить фактический год.

0 голосов
/ 25 ноября 2008

var date_object = new Date (); var year = date_object.getYear (); если (год <2000) { год = год + 1900; } // у тебя будет полный год .... </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...