Показать полную графическую версию : проблема с датами в JS
Вот такой скрипт:
var date = new Date();
var day = date.getDate();
var month = date.getMonth();
var yy = date.getYear();
document.write(day + " " + month + " " + yy );
выдает год на 1900 меньше, чем на самом деле. Т.е. сейчас - 105 год пишет. Где это правится?
Prisoner
05-07-2005, 02:49
Метод getFullYear выдаст "корректное" значение ("корректное" = ожидаемое). Надо отметить, что метод getYear ведет себя как вы описали лишь в Опере (win32, как в иных платформах - не ведаю).
метод getYear ведет себя как вы описали лишь в Опере (win32, как в иных платформах - не ведаю)
под этим, наверное, надо понимать не браузер, а ту Jav'у, что идет в комплекте с Оперой?
Prisoner
05-07-2005, 03:57
Насколько я знаю JS и Java - разные вещи. Мы говорим о JS? Просто JS не выполняется Java машиной, скрипты работают (интерпретируются) так как того захотят производители броузера - потому такая чертополосица (как с HTML-интерпретацией) в JS скриптах по проверке броузера, версии и всего прочего.
я в этом не сильно-то разбраюсь
Насколько я знаю JS и Java - разные вещи
но это точно
Мы говорим о JS?
да
Просто JS не выполняется Java машиной, скрипты работают (интерпретируются) так как того захотят производители броузера
насколько я понимаю:
JS - интерпретируются/выполняются локально
Java - на сервере
Но для выполнения JS браузера не достаточно, я думал, что для этого и нужна Java-машина. Microsoft VM (VirtualMachine) это Java-машина?
Prisoner
05-07-2005, 04:27
Java программы могут выполняться не только на стороне сервера (сервлеты), но и на стороне клиента, однако в любом случае, в рамках Java машины, просто для выполнения апплетов нужно эту машину иметь локально - как раз ту, что идет (может) в поставке с Оперой. Это сторона Java. В случае с JS все проще - обработчик (интерпретатор) встроен в сам броузер и, соответственно, по разному интерпретирует код в зависимости от производителя бродилки - отсюда грабли с датами.
отсюда грабли с датами
только у меня эти "грабли" и в Opera, и в FireFox, и в IE/MyIE...
Prisoner
05-07-2005, 13:41
Забавно, давай сравнивать. Мое добро:
win2k pro sp4;
Opera 8.0;
Firefox 1.0.3;
IE 6.0 sp1.
Грабли с getYear только в Opera, getFullYear работает везде
WinXP Corporate SP1
Opera 7.54u2 build 3929
Firefox 1.0.4
IE 6.0.2800.1106.xpsp1
getYear везде выдает 105
getFullYear еще не успел проверить
dascon
getFullYear еще не успел проверить
проверьте - Вам понравится :)
А Java-машина имеет отношение только к Java, а отнюдь не к JavaScript (как, собственно, уже было написано)
Про разные браузеры, getYear, getFullYear и проблему 2000 года - можно почитать у PPK (http://www.quirksmode.org/js/introdate.html) Ниже текст с этой страницы в моем переводе:
Проблема 2000 года
Проблема 20000-ого года хорошо известна: создатели старых программ не знали по-настоящему, что делать с новым веком. Разработанному Netscape комплексному решению не следовал полностью даже сам Netscape.
При использовании метода date.getYear(), система Netscape выдает не полный год, но его сокращенную версию. В этой системе 1997 превращается в 97, а 2000 оказывается представленным 100.
Microsoft соглашалась с этим не полностью: до 2000 Explorer вел себя так же, как и Netscape, но теперь, когда 2000-ый год наступил, Explorer 4 и 5 выдает нам значение 2000, как Year.
Netscape 3 (и только 3) следует за Explorer. Что касается других браузеров, они все, кроме WebTV, следуют за оригиналом системы Netscape.
Чтобы еще больше все усложнить, использование date.getYear() теперь считается неверным, и следует использовать date.getFullYear(), метод, который, в свою очередь, не поддерживается старыми моделями браузеров. Если метод все же работает, он в любом случае возвращает полное значение года (т.е. 2000 вместо 100).
(дальше показывают, что возвращает Ваш браузер в ответ на:
* The year according to getYear(): (у меня 105 )
* The year according to getFullYear(): ( у меня 2005 )
)
Приводится (http://www.quirksmode.org/js/datecompat.html) сравнение работы getYear() и getFullYear() в 24 браузерах.
Наконец, у Netscape имеется убойный баг в has one grave bug in the реализации document.lastModified. Я (не я, а PPK =) я только перевожу /mar/) обнаружил, что если Вы используете getYear() для этой даты, то Netscape выдает 0 вместо 100, а если используется getFullYear(), то Вы получаете 1900 вместо 2000.
Высчитываем полный год
Огромное спасибо E minor (http://www.wdf.net/) за предоставленную формулу.
К счастью, имеется простое решение этой весьма важной проблемы. Поскольку getYear() поддерживается всеми браузерами, всегда используйте этот метод. Поделите результат на 100 и возьмите модуль так, чтобы получить значение от 0 до 99. Если число меньше 38, прибавьте 2000, если большеi - прибавьте 1900. Такой способ всегда дает правильное значение.
Таким образом, для расчета значения года используем функцию:
function takeYear(theDate)
{
x = theDate.getYear();
var y = x % 100;
y += (y < 38) ? 2000 : 1900;
return y;
}
(Почему 38? Потому, что значение Epoch Time заканчивается в 2038. Можно также использовать
(y > 69) ? 1900: 2000;
потому, что Epoch Time системы может быть до 1970).
Передаем объект Date в функцию, как:
var today = new Date();
Year = takeYear(today);
Теперь Year содержит правильное значение (в данном случае 2005) и мы с успехом решили проблему 2000 года.
Спасибо, вроде разобрался.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.