Почему Javascript getYear() возвращает 108?

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

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

год = 108?

Ответ 1

Это 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 сохранила стандартное поведение.

Ответ 2

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

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

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

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008

Ответ 3

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

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

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

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

Ответ 4

Он должен вернуть число лет с 1900 года.

Ответ 5

используйте date.getFullYear().

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

В дальнейшем браузеры поддерживали getFullYear как стандартный метод для возврата всего года.

Ответ 6

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

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

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

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

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

Ответ 7

Вы должны, как указано, никогда не использовать 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());

Ответ 8

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

Ответ 9

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

Ответ 10

Число, которое вы получаете, - это количество лет с 1900 года. Не спрашивайте меня, почему..

Ответ 11

он возвращает 4-значный год - 1900, который, возможно, был классным 9+ лет назад, но сейчас довольно отсталый. Java java.util.Date также делает это.

Ответ 12

Как говорили другие, он возвращает количество лет с 1900 года. Причина этого заключается в том, что, когда JavaScript был изобретен в середине 90-х годов, это поведение было удобным и совместимым с API-интерфейсами с датами на других языках, В частности, C. И, разумеется, после того, как API был установлен, они не могли изменить его для соображений обратной совместимости.

Ответ 13

BTW, разные браузеры могут возвращать разные результаты, поэтому лучше вообще пропустить эту функцию и всегда использовать getFullYear().

Ответ 14

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