0

時間枠の前の時間、時間枠内の時間、および時間枠の次の時間を計算するクラスを作成しました。

具体的には、タクシー予約システムを作成しています。タクシーは、日帰りは通常料金、夜行は倍の料金がかかります。

Web サイトの所有者は、夜間料金の開始時刻と終了時刻を設定することができます。例として、通常のタクシーの夜間料金が00:00に開始し、 05:00に終了し、ミニバスタクシーの夜間料金が23:00に開始し、 06:00に終了するとします。

クライアントが注文を行った時点で、Google マップが移動時間を計算しているため、移動時間が 2 時間であるとしましょう。

このシナリオに基づいて、タクシーの場合、エンド ユーザーは1 時間の通常料金と1 時間の倍額料金を請求される必要があります。ミニ バスの場合、エンド ユーザーは2 時間分の料金を 2倍の料金で請求する必要があります。ミニ バスの夜間料金は23:00からです。

私のクラスでは、現在の状態では最初の例は正常に動作しますが、2 番目の例は正しくなく、理由がわかりません。

<?php
class tm
{
    private $start_hour     =   0;    //  The hour that the trip starts
    private $start_minute   =   0;    //  The minute that the trip starts
    private $from_hour      =   0;    //  The hour that night rates start
    private $from_minute    =   0;    //  The minute that night rates start
    private $to_hour        =   0;    //  The hour that night rates ends
    private $to_minute      =   0;    //  The minute that night rates ands
    private $duration       =   0;    //  Total trip duration
    private $night_duration =   0;    //  The overall night trip time in minutes
    private $day_duration   =   0;    //  The overall day trip time in minutes
    private $totalHours     =   0;    //  The total duration hours
    private $totalMinutes   =   0;    //  The total duration minutes
    private $extraMinutes   =   0;    //  Extra minutes to calculate

    /**
     * Construct duration calculator class
     * 
     * @param   $start_date     Timestamp   |   The trip start date/time as a timestamp
     * @param   $duration       Seconds     |   The duration time in seconds
     * @param   $night_start    Timestamp   |   The date/time that night rates start as a timestamp
     * @param   $night_end      Time        |   The date/time that night rates end as a timestamp
     */
    public function __construct($start_date = '', $duration = 1, $night_start = '', $night_end = '')
    {
        $this->start_hour   =   date('H', $start_date);
        $this->start_minute =   date('i', $start_date);
        $this->duration     =   ($duration / 60);               //  Convert seconds to minutes
        $this->from_hour    =   date('H', $night_start);
        $this->from_minute  =   date('i', $night_start);
        $this->to_hour      =   date('H', $night_end);
        $this->to_minute    =   date('i', $night_end);

        $this->calculate();
    }

    private function calculate()
    {
        $this->getHoursMinutes();
        $current_hour   =   $this->start_hour % 24;
        $is_first_loop  =   true;

        for($minute = 0; $minute < $this->duration; $minute++)
        {
            $current_minute     =   ($this->start_minute + $minute) % 60;

            if($current_minute  ==  0 && $is_first_loop == false)
            {
                $current_hour   =   ($current_hour + 1) % 24;
            }
            else if($current_minute == 59)
            {
                $is_first_loop = false;
            }

            if(($current_hour >= $this->from_hour && $current_hour < $this->to_hour))
            {
                $this->night_duration++;
            }
            else
            {
                $this->day_duration++;
            }
        }
    }

    private function getHoursMinutes()
    {
        $this->totalHours   =   round($this->duration / 60 / 60, 0);
        $this->totalMinutes =   round($this->duration / 60, 0);
        $this->extraMinutes =   round(($this->duration / 60) % 60, 0);
    }

    public function getDayDuration($inSeconds = true)
    {
        if($inSeconds == true)
        {
            return $this->day_duration * 60;
        }
        else
        {
            return $this->day_duration;
        }
    }

    public function getNightDuration($inSeconds = true)
    {
        if($inSeconds == true)
        {
            return $this->night_duration * 60;
        }
        else
        {
            return $this->night_duration;
        }
    }
}
?>

上記の例に基づいて、次のコードがあるとします。

<?php
    $trip_start_timestamp    =   strtotime('01/09/2013 23:00');
    $duration                =   strtotime('01/10/2013 01:00') - $trip_start_timestamp;
    $night_start             =   strtotime('00:00:00');            // This is the time for taxi start night rate
    $night_end               =   strtotime('05:00:00');            // This is the time for taxi end night rate

    $taxi       =    new tm($trip_start_timestamp, $duration, $night_start, $night_end);

    echo "TAXI NIGHT DURATION<br />";
    echo "Day : " . $taxi->getDayDuration() . '<br />';
    echo "Night : " . $taxi->getNightDuration() . '<br />';

    $trip_start_timestamp    =   strtotime('01/09/2013 23:00');
    $duration                =   strtotime('01/10/2013 01:00') - $trip_start_timestamp;
    $night_start             =   strtotime('23:00:00');            // This is the time for taxi start night rate
    $night_end               =   strtotime('06:00:00');            // This is the time for taxi end night rate

    $miniBus    =    new tm($trip_start_timestamp, $duration, $night_start, $night_end);

    echo "<br />MINI BUS NIGHT DURATION<br />";        
    echo "Day : " . $miniBus->getDayDuration() . '<br />';
    echo "Night : " . $miniBus->getNightDuration() . '<br />';
?>

上記のコードの結果は次のとおりです。

TAXI NIGHT DURATION  
Day : 3600  
Night : 3600  



MINI BUS NIGHT DURATION  
Day : 3600  
Night : 3600

ご覧のとおり、上記の結果は間違っています。ミニバスの夜間料金は23:00から開始されるため、結果は Day: 0 Night: 7200になるはずです。

最後に、次の行にいくつかの変更を加えたことに注意してください。

if(($current_hour >= $this->from_hour && $current_hour < $this->to_hour))

問題はこの行だと思うからです。残念ながら、私は解決策を見つけていません。

4

1 に答える 1