javascript date getYear() возвращает разные результаты между IE и Firefox, как к этому подойти?

По-видимому, метод объекта даты javascript getYear() возвращает разные результаты между IE8 и Firefox3.6 (у меня есть эти 2 на моей машине, не уверен, что другой браузер или версия)

Date d = new Date();
alert(d.getYear());

FF3.6 ==> 111 (year since 1900? i guess)
IE8 ===> 2011

Я тестировал только Firefox, и теперь мой код Javascript, который корректирует возвращаемое значение getYear(), теперь дает мне 3911 из-за моего кодирования.

var modified = d.getYear() + 1900

В Firefox он возвращает 2011. Но если я применяю этот подход к IE8, он возвращает 3911.

Я мог бы добавить логику, чтобы различать IE и Firefox, но я не хочу добавлять такие if/else везде в свой код, где есть такие зависящие от браузера части, как эта. Есть ли другой способ подойти к этой проблеме?

var browserName=navigator.appName; 

if (browserName=="Netscape") { 
   var modified = d.getYear() + 1900
}
else if(browserName=="Microsoft Internet Explorer") { 
   var modified = d.getYear();
}

person Meow    schedule 23.04.2011    source источник
comment
возможный дубликат Почему Javascript getYear() возвращает 108?   -  person Caspar Kleijne    schedule 23.04.2011
comment
год с 1900? Я думаю Почему я думаю? Спецификация находится в свободном доступе: ecma-international.org/publications/standards/ Ecma-262.htm   -  person T.J. Crowder    schedule 23.04.2011
comment
спс за ссылку посмотрю.   -  person Meow    schedule 23.04.2011
comment
msdn.microsoft.com/ en-us/library/windows/apps/ говорит, что getYear устарел. Если это устарело, то почему они возились с ним?!   -  person JoelFan    schedule 13.01.2012


Ответы (5)


Используйте getFullYear() вместо getYear().

person psynnott    schedule 23.04.2011
comment
Firefox делает в точности то, что указано в спецификации. - person T.J. Crowder; 23.04.2011
comment
getYear соответствует требованиям 2000 года, поскольку результат не ограничивается двумя цифрами. Например, для 2012 года он вернет 112, а не 12. Это вещь unixy. - person ikegami; 13.01.2012

попробуйте использовать getFullYear() вместо getYear

person Naren Sisodiya    schedule 23.04.2011
comment
Ваш ответ был первым, но не отмечен как ответ! Я ненавижу, когда это происходит... - person Mikey G; 25.10.2013
comment
это нормально, Майки Г... так как цель всегда состоит в том, чтобы разрешить ОП и поделиться опытом/обучением. ;) - person Naren Sisodiya; 26.10.2013

Если IE8 выдает версию 2011,это ошибка в IE8 (и более ранних версиях, см. обновление ниже). getYear определяется в спецификации (раздел B.2.4) как существование:

  1. Пусть t будет этим значением времени.
  2. Если t равно NaN, вернуть NaN.
  3. Вернуть YearFromTime(LocalTime(t)) − 1900.

Таким образом, сейчас 111 является правильным значением. Это определение не изменилось по сравнению с 3-м изданием, поэтому мы говорим о 12 годах определенного поведения.

Как уже говорили другие, используйте getFullYear, чтобы получить более полезное значение, но это ошибка IE8, если это действительно так, как вы говорите (у меня нет под рукой IE8, чтобы проверить).


Обновление: буду. Только что попробовал, и Microsoft делала ошибку. В IE6, IE7 и IE8 написано "2011". Хорошей новостью является то, что они, наконец, исправили это, IE9 говорит «111», как и должно быть. Вы можете попробовать это в своем браузере здесь: http://jsbin.com/ofuyi3

person T.J. Crowder    schedule 23.04.2011
comment
Очень интересно .. да, это дает мне 2011 год на IE8 - person Meow; 23.04.2011

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

Date d = new Date();
var year = d.getYear();
if (year < 1900) {  // Should always be true, but isn't in older IE.
   year += 1900;
}

Я понимаю, что люди предлагали лучший способ получения результата, но я подумал, что на сам вопрос стоит ответить.

person ikegami    schedule 23.04.2011

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

мля.. должен ответить не менее 30 символов...

person RobG    schedule 23.04.2011