Чому Javascript getYear () повертає 108?


95

Чому цей javascript повертає 108 замість 2008 року? він отримує правильний день і місяць, але не рік?

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

рік = 108?


29
О, гріхи, які ми скоїли, намагаючись пройти через Y2K.
DGentry

3
year = myDate.getFullYear() % 100;
Ендрю Ларссон,

Відповіді:


128

Це справа 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 зберігала стандартну поведінку.


25

Оскільки 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

7
Можливо, щось на зразок Date.prototype.getRealYear = Date.prototype.getFullYear? Date.prototype.getFullYear: function () {return this.getYear () + 1900; };
Валентин Голев

12

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

Я пам’ятаю, як вперше маніпулював датами в Perl. Як не дивно, я прочитав документи . Мабуть, це не звичайна справа. Через рік чи два мене зателефонували в офіс 31 грудня 1999 року, щоб виправити помилку, виявлену в останню можливу хвилину в якомусь контрактному коді Perl, - те, до чого я ніколи не мав нічого спільного. Це було саме цим питанням: дзвінок із стандартною датою повертався з 1900 року, і програмісти розглядали його як двозначний рік. (Вони припускали, що отримають "00" у 2000 році.) Як молодий недосвідчений програміст, мене вразило, що ми заплатили так багато за "професійну" роботу, і ці люди навіть не потрудились прочитати документація. Це був початок багатьох років розчарування; тепер я старий і цинічний. :)

У 2000 році щорічну конференцію YAPC Perl називали "YAPC 19100" на честь цієї часто повідомляваної помилки.

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


1
хе-хе ... нагадує мені мультфільм Ділберта ... "ти читав історію про іспанця на ім'я Мануал?" ;)
Адхіп Гупта

Я вважаю, що @skiphoppy мав на увазі додавання 1900 до getYear () призведе до бажаного повного року. Це схоже на додавання +1 до getMonth () під час отримання читабельного числа місяця. Приклад: var ts = new Date (); var fullYear = (ts.getYear () + 1900); Але використання getFullYear () є кращим. Приклад: var fullYear = new Date (). GetFullYear ();
рецидив


4

використання date.getFullYear().

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

Пізніше браузери підтримували getFullYearяк стандартний метод повернення повного року.


3

Це питання настільки давнє, що змушує мене плакати від ностальгії за днями доткому!

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

До 2000 року у когось могло виникнути спокуса виправити цю помилку, додавши "19" до результату getYear (), що призвело до "помилки 19100 року" . Інші вже відповіли на це запитання достатньо (додайте 1900 до результату getDate ()).

Можливо, книга, яку ви читаєте про JavaScript, трохи стара?

Дякую за вибух із минулого!


Причина, по якій мова (Perl) її не враховувала, полягає в тому, що вона сліпо копіювала дизайнерське рішення C, прийняте набагато раніше. (20 років?)
skiphoppy

Я кидав тінь на JavaScript, а не на Perl. Perl часто виставляє основні підпрограми C досить безпосередньо. Як ви кажете, це продукт свого часу. JS, розроблений принаймні через десять років, міг піти іншим шляхом.
jjohn

2

Як зазначалося, вам ніколи не слід користуватися 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());


1

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



0

Як сказали інші, він повертає кількість років з 1900 року. Причиною цього є те, що коли JavaScript був винайдений в середині 90-х, ця поведінка була одночасно зручною і відповідала датам-часу API інших мов. Зокрема C. І, звичайно, як тільки API був встановлений, вони не могли його змінити з причин зворотної сумісності.


0

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


0

var date_object = нова дата (); var рік = дата_об'єкта.getYear (); якщо (рік <2000) {рік = рік + 1900; } // u отримаємо повний рік ....


-1

він повертає 4-значний рік - 1900, що, можливо, було круто 9+ років тому, але зараз досить відстале. Ява.util.Date Java також робить це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.