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

Форум PHP

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

 

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

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

тема: работа с периодами
 
 автор: ZeeG   (12.07.2015 в 00:13)   письмо автору
 
 

Добрый день. Пожалуйста, подскажите, как корректно определить количество дней, приходящиеся в каждом периоде, между двумя произвольными датами

например:
периоды - 01/01/2015-30/04/2015, 01/05/2015-15/08/2015 и 16/08/2015-31/12/2015
произвольные даты - 05/04/2015 ->18/08/2015

спасибо

  Ответить  
 
 автор: Igorek   (12.07.2015 в 08:03)   письмо автору
 
   для: ZeeG   (12.07.2015 в 00:13)
 

http://php.net/manual/ru/datetime.diff.php

  Ответить  
 
 автор: ZeeG   (12.07.2015 в 11:08)   письмо автору
 
   для: Igorek   (12.07.2015 в 08:03)
 

в уме я представляю, что нужно перевести даты в метки времени, все не трудно
у меня получилось нечто следующее:

 function getDaysForPer($p,$a,$b){

    $startTS = strtotime($a); // начальная заданная дата
    $stopTS = strtotime($b); // конечная заданная дата

    //  массив периодов
    //[3] => Array (
    //        [3] => 20150621,20150820
    //        [5] => 20150821,20150930
    //        [2] => 20151001,20151215
    //        [6] => 20151216,20160110
    //    )

    $str = '';
    foreach($p as $perID => $perDates){

       list($perStart,$perStop) = split(',',$perDates);
       $perStartTS = strtotime($perStart);
       $perStopTS = strtotime($perStop);

           // не могу поставить условия вхождения дат в перерод

       if($startTS >= $perStartTS || $startTS < $perStopTS){
         $dateA = new DateTime($a);
         $dateB = new DateTime($b);
         $str .= $dateB->diff($dateA)->days;
       }
    }
    return $str;
 }

  Ответить  
 
 автор: ZeeG   (12.07.2015 в 14:00)   письмо автору
 
   для: ZeeG   (12.07.2015 в 11:08)
 

в итоге получилось:


 function getDaysForPer($p,$a,$b){

    $startTS = strtotime($a);
    $stopTS = strtotime($b);

    $str = '';

    if( count($p) == 1 ){
        $dateA = new DateTime($a);
        $dateB = new DateTime($b);
        $str .= $dateB->diff($dateA)->days;
    }

    if( count($p) > 1 ){

      $tot = count($p);
      $i = 0;

      foreach($p as $perID => $perDates){
        list($perStart,$perStop) = split(',',$perDates);
        $perStartTS = strtotime($perStart);
        $perStopTS = strtotime($perStop);

          if($i == 0){
          $perStopTS = strtotime($perStop."+1 day");
          $dateA = new DateTime($a);
          $dateB = new DateTime(date("Ymd",strtotime($perStop."+1 day")));
          $str .= $dateB->diff($dateA)->days .' ';
          }

          elseif( $i == $tot-1){
          $dateA = new DateTime($perStart);
          $dateB = new DateTime($b);
          $str .= $dateB->diff($dateA)->days .' ';
          }

          elseif( $i < $tot-1){
          $dateA = new DateTime($perStart);
          $dateB = new DateTime($perStop);
          $str .= $dateB->diff($dateA)->days .' ';
          }

          $i++;
      }
    }

    return $str;
 }


хотелось бы записать короче, но ...)

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

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