Как стать автором
Обновить

Неявная установка значения объекта Date?

Время на прочтение1 мин
Количество просмотров480
Задача: получить вчерашний день и день_неделю_назад на JavaScript'е. Пишу простой скриптик:
var dateToday = new Date();
var tmpDate = new Date();

tmpDate.setDate(dateToday.getDate() - 8);
alert(dateToday); // <- Jun 07, OK
alert( tmpDate ); // <- May 30, OK

tmpDate.setDate(dateToday.getDate() - 1);
alert(dateToday); // <- Jun 07, OK
alert( tmpDate ); // <- May 06, Oooops!


Казалось бы, что тут особенного? Давайте посмотрим, чего я хотел и что получил:
— Создаю два разных объекта типа Date и записываю их в переменные dateToday и tmpDate. Сейчас здесь находится «сегодня»;
— Устанавливаю значение tmpDate в (dateToday — 8 дней), т.е. если сегодня 7 июня, то это получается 30 мая, всё верно. Выводит значение tmpDate — действительно, 30 мая;
— Теперь я хочу получить вчерашний день. Беру значение dateToday (оно нигде не менялось и хранит день сегодняшний) и вычитаю из него 1 день. Я должен получить 6 июня;
— Alert выводит 5 мая!

В чём причина такого странного поведения скрипта? А в том, что у объекта Date свойства день, месяц, год, час и т.п. никак не взаимосвязаны, поэтому первая установка выставила месяц = 5, день = 30, а вторая — только день = 5. Отсюда и получаем 5 мая.

Что делать? Заново инициализировать переменную перед вторым действием. Т.е.:
var dateToday = new Date();
var tmpDate = new Date();

tmpDate.setDate(dateToday.getDate() - 8);
alert(dateToday); // <- Jun 07, OK
alert( tmpDate ); // <- May 30, OK

tmpDate = new Date();

tmpDate.setDate(dateToday.getDate() - 1);
alert(dateToday); // <- Jun 07, OK
alert( tmpDate ); // <- Jun 06, OK!


Для меня это была совершенно неочевидная вещь, потратил полчаса драгоценного времени ;)
Теги:
Хабы:
Всего голосов 18: ↑14 и ↓4+10
Комментарии3

Публикации

Истории

Ближайшие события