За последние 24 часа нас посетили 18714 программистов и 1661 робот. Сейчас ищут 925 программистов ...

Работа с датами

Тема в разделе "Регулярные выражения", создана пользователем GlobalView, 27 июл 2010.

  1. GlobalView

    GlobalView Активный пользователь

    С нами с:
    21 июл 2010
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте!

    Помогите со следующей задачкой)

    Сервер не работал с 01.07.2010 10:51:32 по 05.07.2010 16:17:51 (это из БД идёт)
    Но надо считать время его дауна только для след-х интервалов:
    Понедельник - Пятница 07:00 - 23:00
    Суббота - 09:00 - 15:00
    Воскресенье - 12:00 - 23:00

    Пробовал использовать mktime(), но он удобен для сравнения, а для разности дат его не получается использовать...

    Заранее спасибо!)
     
  2. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    PHP:
    1.  
    2. //$t1 -начало интервала из базы
    3. //$t2 -конец интервала из базы
    4. //превращаем в секунды
    5. $ts1=strtotime($t1);
    6. $ts2=strtotime($t2);
    7. $d=intval(date("d",$ts1));
    8. $m=intval(date("m",$ts1));
    9. $y=intval(date("Y",$ts1));
    10. $start=$ts1;
    11. $ok=true;
    12. $nojob=0;//время простоя
    13. do
    14. {
    15.    
    16.     $next=mktime(0,0,1,$m,$d+1,$y); //начало следующего дня
    17.     $daystart=$start;
    18.     if($next<=$ts2)
    19.     {
    20.  
    21.         $dayend=mktime(23,59,59,$m,$d,$y);
    22.         $start=$next;
    23.  
    24.     }
    25.     else
    26.     {
    27.  
    28.         $dayend=$ts2;
    29.         $ok=false;
    30.     }
    31.     $dweek=date("w",$daystart);
    32.     //0-Sunday,6-Saturday
    33.     if($dweek==0)
    34.     {
    35.        $startjob=mktime(12,00,00,$m,$d,$y);
    36.        $endjob=mktime(23,00,00,$m,$d,$y);
    37.     }
    38.     elseif($dweek==6)
    39.     {
    40.        $startjob=mktime(9,00,00,$m,$d,$y);
    41.        $endjob=mktime(15,00,00,$m,$d,$y);
    42.     }
    43.     else
    44.     {
    45.        $startjob=mktime(7,00,00,$m,$d,$y);
    46.        $endjob=mktime(23,00,00,$m,$d,$y);
    47.     }
    48.     if($daystart<$startjob)
    49.     {
    50.         $startNojob=$startjob;
    51.     }
    52.     else
    53.     {
    54.         $startNojob=$daystart;
    55.     }
    56.     if($dayend<$endjob)
    57.     {
    58.         $endNojob=$dayend;
    59.     }
    60.     else
    61.     {
    62.         $endNojob=$endjob;
    63.     }
    64.     $nojob=$nojob+$endNojob-$startNojob;
    65.     $d++;
    66.  
    67. }while ($ok);
    68. print  $nojob;
    69.  
    Идея
    1) разбить весь период по дням
    2) для каждого дня определить
    * начало и конец дня
    * начало и конец учитываемого простоя
    3) вычислить простой