Как написать код акции с изменением переменной каждые 4 дня?

378
16 января 2018, 14:40

Помогите написать код акции Есть день например сегодня 15, акция до 19 числа, 16 числа тоже 19, но когда наступает 19 число, то акция меняется до 23, то есть каждые 4 дня меняется число в блоке, как решить? Понимаю что примерно так, но дальше ничего в голову не лезет(

var date = new Date();
var target = 15;
var now = date.getDate();
if (now === target) {
// do something
target += 4; 
}
Answer 1

Если я правильно понял формулировку, то:

  • Есть некий текст вывода вроде "Акция длится до ДД.ММ.ГГГГ"
  • Нужно выводить ДД.ММ.ГГ такими, что до конца акции всегда остается от 4 до 1 дня, но когда эта дата приходит - продлевать акцию на 4 дня

В итоге пользователь всегда будет видеть "горячую акцию", до конца которой осталось менее 4 дней, но явного обмана не будет - в пределах 4 дней акция до одного и того же числа

Открываем описание класса Javascript Date() в любом гугле

Для простоты будем использовать номер дня в месяце getDate() (не самое очевидное название) за старт акции (то есть с 1 по 4 число, с 5 по 9, с 10 по 14 и так далее)

Есть текущая дата. Нам нужно узнать, когда при текущей дате "закончится" акция. Очевидно, что в следущий день, (номер-1) которого будет нацело делиться на 4. Минус один потому что нумерация дней начинается с 1, а числа в математике начинаются с 0.

/* Текущая дата и время */
var now = new Date();
/* Для отладки вы можете использовать не сегодняшнюю дату, а пример ниже */
// now = new Date(2017,4,14,2,31,30);
alert('Сегодня '+now.toLocaleString());
/* До тех пор, пока (номер дня - 1) не делится нацело на 4, прибавляем 1 день к дате */
while ((now.getDate()-1) % 4 != 0) {
    now.setDate(now.getDate()+1);
}
alert('Акция закончится '+now.toLocaleString());

Более "страшный" вариант, но более надежный - считать в секундах от начала эпохи:

/* Текущая дата и время */
var now = new Date();
alert('Сегодня '+now.toLocaleString());
/* До тех пор, пока (номер дня - 1) не делится нацело на 4, прибавляем 1 день к дате */
var one_day = 1*24*60*60*1000; // Один день в миллисекундах
var period = 4*24*60*60*1000; // Период обновления акции в миллисекунды
// Прежде чем двигать время, надо округлить до целых суток, иначе имеем бесконечный цикл
now.setTime(now.getTime() - now.getTime() % one_day);
while ((now.getTime() % period) != 0) {
    now.setTime(now.getTime()+one_day);
}
alert('Акция закончится '+now.toLocaleString());

Логика та же самая, только блок 4 дня переводится в секунды. Тонкости - временная зона

READ ALSO
Mojolicious и reCAPTCHAv2 в popup

Mojolicious и reCAPTCHAv2 в popup

Здравствуйте! Имеется такая ситуация: по нажатию кнопки "отправить" срабатывает обработчик чекера-форм, если всё верно -- вызывается всплывающее...

381
Удаление повторного div'а по имени класса

Удаление повторного div'а по имени класса

Есть два <div> одинакового классаНа странице один выше другого

278
Как добавить аргументы в функцию

Как добавить аргументы в функцию

Как сделать так, чтобы select принимал в функции query() в переменной result результат функции filterIn() и фильтровал по своим аргументам 'name', 'gender', 'email'Не...

336
Как создать массив DOM елементов?

Как создать массив DOM елементов?

Мне нужно создать массив классаtab_p, потом получить каждого из них высоту и назначить всем элементам данного класса наибольшую высоту

300