2012-04-03 9 views
0

私は現在、何が基本的な作業にすべきかと苦労しています。私は開始日、終了日、およびカウントを持っています。私は1時間に何回、第3のパラメータ(カウント)が2つの日付の間に減少するかを計算する必要があります:そう、毎時のように。PHP日付の間のカウントを減らす

そのビット、私はOKをカバーしていると思います。問題は今すぐに来る。

私たちのウェブサイトが開けば、になるだけです。これらの時間は配列に格納され、0インデックスは開いており、1は近いです。また、日付は動的にnowに更新されます。

Array 
(
    [mon] => Array 
     (
      [0] => 2012-04-03 9:00 
      [1] => 2012-04-03 21:30 
     ) 

    [tue] => Array 
     (
      [0] => 2012-04-03 9:00 
      [1] => 2012-04-03 21:30 
     ) 

    [wed] => Array 
     (
      [0] => 2012-04-03 9:00 
      [1] => 2012-04-03 21:30 
     ) 

    [thu] => Array 
     (
      [0] => 2012-04-03 9:00 
      [1] => 2012-04-03 21.30 
     ) 

    [fri] => Array 
     (
      [0] => 2012-04-03 9:00 
      [1] => 2012-04-03 19:00 
     ) 

    [sat] => Array 
     (
      [0] => 2012-04-03 9:00 
      [1] => 2012-04-03 18:00 
     ) 

    [sun] => Array 
     (
      [0] => 2012-04-03 10:30 
      [1] => 2012-04-03 19:00 
     ) 

) 

したがって、1時間ごとにカウンターが減少しますが、開幕時間の間です。しかし、我々が閉鎖されている場合、カウンターになるまでの時間を今日までに計算する必要があります。

openTimesには、現在開いているか閉じているかを確認するために使用できるareWeOpenという変数があります。私たちは、しかし、常に動作していないよういくつかのコードを持っている:

function countOffers($start, $end, $deals) { 
    global $openTimes; 

    if(strtotime($end) < time()) return 1; 

    define('ONEHOUR', 1); 

    $totalDays = unixtojd(strtotime($end)) - unixtojd(strtotime($start)); 
    $daysBefore = unixtojd(time()) - unixtojd(strtotime($start)); 
    $daysAfter = unixtojd(strtotime($end)) - unixtojd(time()); 
    $startDay = strtolower(date("D", strtotime(date("Y-m-d", strtotime($start))))); 
    $totalHours = 0; 
    $hoursBefore = 0; 

    /* TOTAL HOURS */ 
    for($i = 0; $i <= $totalDays; $i++) { 
     $dayName = strtolower(date("D", strtotime(date("Y-m-d", strtotime($start)) . " +$i days"))); 
     $day = $openTimes->openDays[$dayName]; 
     if($i === 0) { 
      $startHour = explode(" ", $start); 
      $startHour = str_replace(array(":","3"), array(".","5"), $startHour[1]); 
      $endHour = explode(" ", $day[1]); 
      $endHour = str_replace(array(":","3"), array(".","5"), $endHour[1]); 
      $totalHours += $endHour - $startHour; 
     } else { 
      $tempHour = (strtotime($day[1]) - strtotime($day[0]))/3600; 
      $totalHours += (strtotime($day[1]) - strtotime($day[0]))/3600; 
     } 
    } 
    $perHour = round($deals/$totalHours, 1); 

    $today = 0; 
    if($openTimes->areWeOpen === FALSE && $openTimes->morning === FALSE) { 
     /* HOURS UP TO TODAY */ 
     for($i = 0; $i < $daysBefore; $i++) { 
      $day = $openTimes->openDays[strtolower(date("D", strtotime(date("Y-m-d", strtotime($start)) . " +$i days")))]; 
      $hoursBefore += (strtotime($day[1]) - strtotime($day[0]))/3600; 
     } 
    } elseif (strtotime($start) <= time()) { 
     /* HOURS UP TO YESTERDAY */ 
     for($i = 0; $i < ($daysBefore-1); $i++) { 
      $day = $openTimes->openDays[strtolower(date("D", strtotime(date("Y-m-d", strtotime($start)) . " +$i days")))]; 
      $hoursBefore += (strtotime($day[1]) - strtotime($day[0]))/3600; 
     } 

     if(strstr($start, date("Y-m-d", time()))) { 
      $today = ceil((time() - strtotime($start))/3600) - ONEHOUR; 
     } else { 
      $today = ceil((time() - strtotime($openTimes->openDays[strtolower(date("D", time()))][0]))/3600) - ONEHOUR; 
     } 
    } 
    $alreadyGone = $hoursBefore*$perHour; 

    $dealsLeft = $deals - (($hoursBefore*$perHour) + ($today*$perHour)); 
    if($dealsLeft < 0.5) $dealsLeft = 1; 

    return round($dealsLeft); 
} 

それが正しくカウントだろう、しかし、我々が閉じているとき、それは減少し続けるだろう苦労しているようです。私はこれを行うためのより良い方法が必要であることを知っている、私はそれを把握することはできません。あまりにも頭の中の問題を複雑すぎると思っています。

* 編集:営業時間中に

(配列で提供)私は時の倍の値x量を減少させる必要があります:*さて、ここで私が達成しようとしているかのブレークダウンがありますその日。閉鎖されている場合は、の最後のの終了時刻までその値を減らしたいだけです。

カウンタの開始日、終了日、開始番号が与えられます。毎日午前9時から午後9時の間、値は減少する可能性があります。その時間が過ぎている場合、または現在閉鎖されている場合は、最後の閉鎖時刻(潜在的には昨日)まで減少させたいだけです。

+3

トピックはありませんが、私は本当になぜウェブサイトに営業時間があるのか​​興味があります。 – JJJ

+0

このような電話を受けるスタッフがいないため、オンラインでは何も販売していません。私たちのウェブサイトはオンラインのパンフレットのようなものです。 – James

+1

@Jamesあなたは好きかもしれません...あなたのウェブサイトでは、特定の時間に電話をしないように簡単に言っています..? –

答えて

1

これは、最もかわいいコードではありませんが、私はそれがあなたが求めていることをしていると思います。テストへ

<?php 
/* test data 
$openTimes->openDays = array(
'mon' => array('2012-03-27 09:00', '2012-03-27 21:30'), 
'tue' => array('2012-03-27 09:00', '2012-03-27 21:30'), 
'wed' => array('2012-03-27 09:00', '2012-03-27 21:30'), 
'thu' => array('2012-03-27 09:00', '2012-03-27 21:30'), 
'fri' => array('2012-03-27 09:00', '2012-03-27 19:00'), 
'sat' => array('2012-03-27 09:00', '2012-03-27 18:00'), 
'sun' => array('2012-03-27 10:30', '2012-03-27 19:00'), 
); 
*/ 

function countOffers($start, $end, $deals, $now='') { 
    $start = new DateTime($start); 
    $end = new DateTime($end); 
    $now = new DateTime($now); 
    if ($now <= $start) { 
     return $deals; 
    } 
    if ($now >= $end) { 
     return 0; 
    } 
    $totalHours = openTimeBetween($start, $end)/60/60; 
    $hoursRemaining = openTimeBetween($now, $end)/60/60; 
    $perHour = $deals/$totalHours; 
    return (int)round($hoursRemaining * $perHour); 
} 

function openTimeBetween($start, $end) { 
    $totalTime = 0; 
    $today = new DateTime($start->format('Y-m-d H:i:s')); 
    while ($today <= $end) { 
     $totalTime += openTimeRemaining($today, $start, $end); 
     // set time to midnight the next day 
     $today->setTime(0, 0, 0); 
     $today->modify('+1 day'); 
    } 
    return $totalTime; 
} 

function openTimeRemaining($current, $minTime, $maxTime) { 
    global $openTimes; 
    // get the open/close times 
    $day = strtolower($current->format('D')); 
    list($open, $close) = $openTimes->openDays[$day]; 
    $open = new DateTime($open); 
    $close = new DateTime($close); 
    // set the date to be the same as $current 
    $open->setDate($current->format('Y'), $current->format('m'), $current->format('d')); 
    $close->setDate($current->format('Y'), $current->format('m'), $current->format('d')); 

    // if it's past closing time or past the maximum time 
    if ($current > $close || $current > $maxTime) { 
     return 0; 
    } 
    // if it's the first day, count from $minTime or $current, whichever is later 
    else if ($current->format('Y-m-d') === $minTime->format('Y-m-d')) { 
     $diff = max($minTime, $current, $open)->diff($close); 
    } 
    // if it's the last day, count to $maxTime or $close, whichever is earlier 
    else if ($current->format('Y-m-d') === $maxTime->format('Y-m-d')) { 
     $diff = max($current, $open)->diff(min($maxTime, $close)); 
    } 
    // otherwise count the total open time 
    else { 
     $diff = $open->diff($close); 
    } 
    return $diff->h * 60 * 60 + $diff->i * 60 + $diff->s; 
} 

、あなたは現在の時刻として使用する第四パラメータ文字列でcountOffers()を呼び出すことができます。

$start = '2012-03-27 11:00:00'; 
$end = '2012-04-08 19:00:00'; 
$offers = 200; 
$now = '2012-04-04 17:00:00'; 
countOffers($start, $end, $offers, $now); 

余分なパラメータをデフォルトのままにして、現在の時刻にします。

+0

それは私がそれを感じることができるように近いです。しかし、それが午前中で閉鎖されている場合、私はそれを昨日の閉鎖時間に戻すことはできません。私はフィドルがあります!でもありがとう! – James

+0

すべてソート!ありがとうございます:3 – James