|
|
|
| ... и соответственно построить алгоритм.
Надо распределять пользователей по посланной ими дате в определенные даты и сообщать им об этом.
Например, пользователь прислал дату, которая входит в интервал с 20.05 по 05.06, ему надо послать новую дату - 05.05.
Если пользователь прислал дату, входящую в интервал с 5.06 по 20.06, то ему надо послать дату - 20.05.
И так постоянно. Дата, посылаемая пользователю, должна быть на 15 дней младше нижней границы интервала, в который
она входит. Мне что-то ничего, кроме банального переключателя на ум не приходит. А ведь случаев таких м.б. много. Надо
как-то это циклом оформить... От чего отталкиваться в цикле? Даты, которые меньше, чем сегодня, посылать смысла нет.
Значит, надо еще делать проверку на актуальность. Посылать можно одну дату. Допустим, пользователь прислал
дату 30/09.
На 15 дней меньше - 15/09. Но 15 мы прислать не можем, только 5 или 20. Нарисовав таблицу с десятком вариантом, обнаружила,
что посылаемая дата всегда ровно на месяц (30 дней) меньше верхней границы интервала, в который входит присланная дата. Но как
узнать, в какой именно интервал она входит? 31/05 входит в интервал с 20/05 по 05/06 и послать надо дату 05/05. 30/09 входит в
интервал с 20/09 по 05/10 и послать надо 05/09 (а у меня получается только 15/09, что неверно). Всю голову уже сломала. Пока
оставила выбор из кейса, но это нехорошо.
switch(date_to_timestamp($mem_expdate))
{ /// from 20/05 00:00 to 5/06 -> 5/05 00:00
case (date_to_timestamp($mem_expdate)>= 1432069200 && date_to_timestamp($mem_expdate)<1433451600):
$_SESSION["date_klir_message"] = 1430773200; // 5/05
break;
/// from 05/06 00:00 to 20/06
case (date_to_timestamp($mem_expdate)>= 1433451600 && date_to_timestamp($mem_expdate)<1434747600):
$_SESSION["date_klir_message"] = 1432069200; // 20/05
break;
/// from 20/06 00:00 to 05/07 00:00
case (date_to_timestamp($mem_expdate)>= 1434747600 && date_to_timestamp($mem_expdate)<1436043600):
$_SESSION["date_klir_message"] = 1433451600; // 05/06
break;
/// from 05/07 00:00 to 20/07 00:00
case (date_to_timestamp($mem_expdate)>= 1436043600 && date_to_timestamp($mem_expdate)<1437339600):
$_SESSION["date_klir_message"] = 1434747600; // 20/06
break;
/// from 20/07 00:00 to 05/08 00:00
case (date_to_timestamp($mem_expdate)>= 1437339600 && date_to_timestamp($mem_expdate)<1438722000):
$_SESSION["date_klir_message"] = 1436043600; // 05/07
break;
}
|
| |
|
|
|
|
|
|
|
|
для: elenaki
(23.04.2015 в 20:48)
| | по моему, после проверки на позже сегодня, нужно честно перейти к компонентному представлению,
<?php
list($d, $m, $y) = explode('.', "21.04.2015");
if($d > 20) { $d = 5; ++$m; }
elseif($d > 5) $d = 20;
else $d = 5;
if(!--$m) { --$y; $m += 12; }
echo "$d.$m.$y";
?>
|
а потом вернуться назад, к таймштампу, если уж сильно требуется.. | |
|
|
|
|
|
|
|
для: Trianon
(24.04.2015 в 10:04)
| | Не-а. Если число больше 20-го, то надо месяц минусовать. | |
|
|
|
|
|
|
|
для: elenaki
(27.04.2015 в 19:25)
| | . | |
|
|
|
|
|
|
|
для: elenaki
(27.04.2015 в 19:25)
| | попробовал переписать прямо с задания в лоб:
<?php
list($d, $m, $y) = explode('.', "21.04.2015");
// вычисляем нижнюю границу:
if($d < 5) { $d = 20; --$m; } // до 5 числа - 20е пред.месяца
elseif($d < 20) $d = 5; // с 5 до 20 - 5е
else $d = 20; // от 20 - 20е
$d = 25 - $d; // меняем на сопряженную 5 - 20 / 20 - 5
if($d == 20) --$m; // назад во времени
if($m <1) { $m += 12; --$y; } // корректируем месяц и год, если нужно
echo "$d.$m.$y";
?>
|
| |
|
|
|
|
|
|
|
для: elenaki
(23.04.2015 в 20:48)
| | а если создать таблицу с полями Начальная дата, Конечная дата и Новая дата и делать выборку Новой даты по полям где Дата больше начальной и меньше конечной. При желании можно даже двумя полями обойтись, выбирая конечное и вычитая из него месяц | |
|
|
|