Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не могу выявить закономерность
 
 автор: elenaki   (23.04.2015 в 20:48)   письмо автору
 
 

... и соответственно построить алгоритм.

Надо распределять пользователей по посланной ими дате в определенные даты и сообщать им об этом.
Например, пользователь прислал дату, которая входит в интервал с 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; 
        } 

  Ответить  
 
 автор: confirm   (24.04.2015 в 06:03)   письмо автору
 
   для: elenaki   (23.04.2015 в 20:48)
 

http://php.net/manual/ru/class.dateinterval.php

  Ответить  
 
 автор: Trianon   (24.04.2015 в 10:04)   письмо автору
 
   для: 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";
?>

а потом вернуться назад, к таймштампу, если уж сильно требуется..

  Ответить  
 
 автор: elenaki   (27.04.2015 в 19:25)   письмо автору
 
   для: Trianon   (24.04.2015 в 10:04)
 

Не-а. Если число больше 20-го, то надо месяц минусовать.

  Ответить  
 
 автор: Trianon   (28.04.2015 в 00:11)   письмо автору
 
   для: elenaki   (27.04.2015 в 19:25)
 

.

  Ответить  
 
 автор: Trianon   (28.04.2015 в 17:27)   письмо автору
 
   для: 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";
?> 

  Ответить  
 
 автор: lightning.say   (28.04.2015 в 12:37)   письмо автору
 
   для: elenaki   (23.04.2015 в 20:48)
 

а если создать таблицу с полями Начальная дата, Конечная дата и Новая дата и делать выборку Новой даты по полям где Дата больше начальной и меньше конечной. При желании можно даже двумя полями обойтись, выбирая конечное и вычитая из него месяц

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования