Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   проблема с датами в JS (http://forum.oszone.net/showthread.php?t=51299)

dascon 05-07-2005 02:16 338408

проблема с датами в 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 338413

Метод getFullYear выдаст "корректное" значение ("корректное" = ожидаемое). Надо отметить, что метод getYear ведет себя как вы описали лишь в Опере (win32, как в иных платформах - не ведаю).

dascon 05-07-2005 03:38 338416

Цитата:

метод getYear ведет себя как вы описали лишь в Опере (win32, как в иных платформах - не ведаю)
под этим, наверное, надо понимать не браузер, а ту Jav'у, что идет в комплекте с Оперой?

Prisoner 05-07-2005 03:57 338419

Насколько я знаю JS и Java - разные вещи. Мы говорим о JS? Просто JS не выполняется Java машиной, скрипты работают (интерпретируются) так как того захотят производители броузера - потому такая чертополосица (как с HTML-интерпретацией) в JS скриптах по проверке броузера, версии и всего прочего.

dascon 05-07-2005 04:19 338420

я в этом не сильно-то разбраюсь
Цитата:

Насколько я знаю JS и Java - разные вещи
но это точно
Цитата:

Мы говорим о JS?
да
Цитата:

Просто JS не выполняется Java машиной, скрипты работают (интерпретируются) так как того захотят производители броузера
насколько я понимаю:
JS - интерпретируются/выполняются локально
Java - на сервере
Но для выполнения JS браузера не достаточно, я думал, что для этого и нужна Java-машина. Microsoft VM (VirtualMachine) это Java-машина?

Prisoner 05-07-2005 04:27 338421

Java программы могут выполняться не только на стороне сервера (сервлеты), но и на стороне клиента, однако в любом случае, в рамках Java машины, просто для выполнения апплетов нужно эту машину иметь локально - как раз ту, что идет (может) в поставке с Оперой. Это сторона Java. В случае с JS все проще - обработчик (интерпретатор) встроен в сам броузер и, соответственно, по разному интерпретирует код в зависимости от производителя бродилки - отсюда грабли с датами.

dascon 05-07-2005 10:57 338496

Цитата:

отсюда грабли с датами
только у меня эти "грабли" и в Opera, и в FireFox, и в IE/MyIE...

Prisoner 05-07-2005 13:41 338552

Забавно, давай сравнивать. Мое добро:
win2k pro sp4;
Opera 8.0;
Firefox 1.0.3;
IE 6.0 sp1.
Грабли с getYear только в Opera, getFullYear работает везде

dascon 05-07-2005 14:15 338567

WinXP Corporate SP1
Opera 7.54u2 build 3929
Firefox 1.0.4
IE 6.0.2800.1106.xpsp1
getYear везде выдает 105
getFullYear еще не успел проверить

mar 07-07-2005 00:12 339011

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 )
)

Приводится сравнение работы getYear() и getFullYear() в 24 браузерах.

Наконец, у Netscape имеется убойный баг в has one grave bug in the реализации document.lastModified. Я (не я, а PPK =) я только перевожу /mar/) обнаружил, что если Вы используете getYear() для этой даты, то Netscape выдает 0 вместо 100, а если используется getFullYear(), то Вы получаете 1900 вместо 2000.

Высчитываем полный год

Огромное спасибо E minor за предоставленную формулу.

К счастью, имеется простое решение этой весьма важной проблемы. Поскольку 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 года.

dascon 07-07-2005 01:23 339022

Спасибо, вроде разобрался.


Время: 16:34.

Время: 16:34.
© OSzone.net 2001-