球场分时段计费算法
1.输入数据 开始结束时间
2.变量(时间段,单价,初始价,封顶价)
3.思路 :(1).传入开始结束时间,提取必要的对比信息(开始结束小时,时间戳,经过时长)。(2.)根据时间创建1-2的数组。(2.循环时间数组,调用不同时间段的计价方法)
不废话,直接贴贴代码
public $stime = "2018-08-04 23:41:00";//开始时间
public $etime = "2018-08-05 19:55:00";//结束时间
public $h1=6; //第一时段结束 第二时段开始的小时
public $h2=12;//第二时段结束 第三时段开始的小时
public $h3=18;//第三时段结束 第四时段开始的小时
public $b_price=10; //起步价1
public $price1=0.1; // 第一时段价格
public $price2=0.2; // 第二时段价格
public $price3=0.3; // 第三时段价格
public $price4=0.5; // 第四时段价格
public $top1=22; //封顶价1
public $top2=25; //封顶价2
public $top3=28; //封顶价3
public $top4=32; //封顶价4
public $sum=0;//总价
public $sum1=0;//第1时段价格
public $sum2=0;//第2时段价格
public $sum3=0;//第3时段价格
public $sum4=0;//第4时段价格
public $sum2_1=0;//第2-1时段价格
public $sum2_2=0;//第2-2时段价格
public $sum2_3=0;//第2-3时段价格
public $sum2_4=0;//第2-4时段价格
/**
* 球场计价算法
* @param 开始 结束时间
* @return string 消费金额,消费时段,消费明细
*/
//http://localhost/baoxian/home/sum/test/stime/2018-08-04%2001:00:00/etime/2018-08-06%2001:15:05
public function test()
{
//$stime=$_GET['stime'];//开始时间
//$etime=$_GET['etime'];//结束时间
/* public $stime = "2018-08-04 03:02:00";//开始时间
public $etime = "2018-08-04 06:03:05";//结束时间 */
$sth=(int)substr($this->stime,11,2);//开始的小时
$stm=(int)substr($this->stime,14,2);//开始的分钟
$eth=(int)substr($this->etime,11,2);//结束的小时
$etm=(int)substr($this->etime,14,2);//结束的分钟
$st_00=strtotime(substr($this->stime,0,10));//开始日期 时间000 判断是否跨天
$st=strtotime($this->stime);//转时间戳
$et=strtotime($this->etime);
$et_st_00=$et - $st_00;//经过时长 0点开始(秒)
$et_st=$et - $st;//经过时长 不是 0点开始(秒)
//将时间分段 跨天用2天的数组
if($et_st_00 <= 86400)
{
$time_arr= array(0,$this->h1,$this->h2,$this->h3,24);//默认时段数组
}
else
{
$time_arr= array(0,$this->h1,$this->h2,$this->h3,24,24+$this->h1,24+$this->h2,24+$this->h3,48);//默认时段数组
}
//从开始世时间 左侧开始截取
if($sth >= 0 && $sth < $this->h1)
{
array_splice($time_arr, 0, 1, $sth);
}
else if($sth >= $this->h1 && $sth < $this->h2)
{
array_splice($time_arr, 0, 2, $sth);
}
else if($sth >= $this->h2 && $sth < $this->h3)
{
array_splice($time_arr, 0, 3, $sth);
}
else if($sth >= $this->h3 && $sth < 24)
{
array_splice($time_arr, 0, 4, $sth);
}
//dump($et_st_00>86400?$eth+24:$eth);
//从结束时间 右侧开始截取 结束时间不能=设置的时间点
if($eth>= $this->h3 && $eth< 24 && $et_st_00 - $this->h3*3600>0)
{
$eth=$et_st_00>86400?$eth+24:$eth;
array_splice($time_arr, count($time_arr)-1, 1, $eth);
}
else if($eth>= $this->h2 && $eth<= $this->h3 && $et_st_00 - $this->h2*3600>0)
{
$eth=$et_st_00>86400?$eth+24:$eth;
array_splice($time_arr, count($time_arr)-2, 2, $eth);
}
else if($eth>= $this->h1 && $eth<= $this->h2 && $et_st_00 - $this->h1*3600>0)
{
$eth=$et_st_00>86400?$eth+24:$eth;
array_splice($time_arr, count($time_arr)-3, 3, $eth);
}
else if($eth>= 0 && $eth<= $this->h1)
{
$eth=$et_st_00>86400?$eth+24:$eth;
array_splice($time_arr, count($time_arr)-4, 4, $eth);
}
//上面的是4个时段截取, 如果跨天 可以弄成8个时段截取后面的, 超两天直接封顶50元 跨天的第二天开始循环使用sum1 234
//dump($time_arr); //die;
//dump($et_st);dump($et);
//调用4个时间段的计算方法
/* $sum1=$this->sum1($time_arr[0],$time_arr[1],$et_st,$st_00,$st,$et);
$sum2=$this->sum2($time_arr[1],$time_arr[2],$et_st,$st_00,$st,$et);
$sum3=$this->sum3($time_arr[2],$time_arr[3],$et_st,$st_00,$st,$et); */
//根据开始结束时间段
for($i=0;$i<count($time_arr)-1;$i++)
{
$day=$time_arr[$i]>=24 ? 2 : 1;//判断第一还是第二天
if($time_arr[$i] >=0 && $time_arr[$i] < $this->h1)
{
$sum1=$this->sum1($time_arr[$i],$time_arr[$i+1],$et_st,$st_00,$st,$et,$day);
}
else if( $time_arr[$i]>=$this->h1 && $time_arr[$i] <$this->h2)
{
$sum2=$this->sum2($time_arr[$i],$time_arr[$i+1],$et_st,$st_00,$st,$et,$day);
}
else if( $time_arr[$i]>=$this->h2 && $time_arr[$i] <$this->h3)
{
$sum3=$this->sum3($time_arr[$i],$time_arr[$i+1],$et_st,$st_00,$st,$et,$day);
}
else if( $time_arr[$i]>=$this->h3 && $time_arr[$i] <24)
{
$sum4=$this->sum4($time_arr[$i],$time_arr[$i+1],$et_st,$st_00,$st,$et,$day);
}
//第二天部分
else if( $time_arr[$i]>=24 && $time_arr[$i] <$this->h1+24)
{
$sum2_1=$this->sum1($time_arr[$i]-24,$time_arr[$i+1]-24,$et_st,$st_00,$st,$et,$day);
}
else if( $time_arr[$i]>=$this->h1+24&& $time_arr[$i] <