<?php
namespace Lib;
/**
* @author kelley<riou00@qq.com>
* 预约时间生成
* 1.根据入驻天数生成入驻时间表
* 2.根据入驻时间及退房时间生成入驻信息
* [说明]
* 可自定义设置每天退房时间在当前中的哪个小时,但必须是24小时制
* 可自定义分隔当天中指定小时前归当前,指定小时后归第二天,但必须是24小时制
* **/
class BookDate{
private $startSpecTime = 7;
private $endSpecTime = 14;
public static function getInstance(){
return new self();
}
/**
* 根据预约时间及退房时间生成入驻时间表
* @param $startTimeStampAll
* @param $$endTimeStemp
* **/
public function bookTime($startTimeStamp, $endTimeStamp){
$_enterData = $this->enterTime($startTimeStamp, $endTimeStamp, $this->startSpecTime, $this->endSpecTime);
return $_enterData;
}
/**
* 通过入驻天数生成预约时间表
* **/
public function bookDay($startTimeStamp, $buyDay){
/**
* 判断当前小时与分断时间
* 如果在分断时间之前
* 则退房时间在当天
* 否则退房时间在第二天
* **/
$currentHour = date('H', $startTimeStamp);
$_x = ($currentHour < $this->startSpecTime)?true:false;
$spaceDayNumber = ($_x)?$buyDay-1:$buyDay;
$endTimeStamp = mktime($this->endSpecTime, 0, 0, date('m', $startTimeStamp), date('d', $startTimeStamp) + $spaceDayNumber, date('Y', $startTimeStamp));
$_enterData = $this->enterTime($startTimeStamp, $endTimeStamp, $this->startSpecTime, $this->endSpecTime);
return $_enterData;
}
/**
* 设置分断时间
* 分断时间(24小时制)
* 在分断时间之前 入驻时间算当天
* 在分断时间之后入驻时间算第二天
*
* @param $specTime 分断时间
* **/
public function setSpecTime($specTime){
$this->startSpecTime = $specTime;
return $this;
}
/**
* 退房时间
* {退房时间[$endSpecTime]}必须大于{分断时间[$startSpecTime]}
*
* @param $checkOut退房时间
* **/
public function setCheckOut($checkOut){
$this->endSpecTime = $checkOut;
return $this;
}
/**
* 入驻数据生成
* @param $startTimeStamp 入驻时间
* @param $endTimeStamp 退房时间
* @param $startSpecTime 分断时间(24小时制)
* @param $endSpecTime 退房时间小时(24小时制)
*
* [业务逻辑说明]
* {分断时间[$startSpecTime]}必须小于{退房小时[$endSpecTime]}
* 在分断时间之前 入驻时间算当天
* 在分断时间之后入驻时间算第二天
*
* example{例}:
* 分断时间{$startSpecTime}:7:00
* 退房时间{$endSpecTime}:14:00
* 4月1日 01:00:00 入驻,4月2日 14:00退房 算两天
*
* **/
private function enterTime($startTimeStamp, $endTimeStamp,$startSpecTime, $endSpecTime){
$message = [];
$startSpecTime = intval($startSpecTime);
$endSpecTime = intval($endSpecTime);
if(empty($startSpecTime) || empty($endSpecTime))
throw new \Exception('未设置分断时间或奶辶 时间', -1);
if($startSpecTime>=$endSpecTime)
throw new \Exception('分段小时不能大于退房分段小时', -1);
// $separateStrtHour = ($startSpecTime<=0)?7:$startSpecTime;//开始小时分隔(24小时制)
// $separateEndHour = ($endSpecTime<=0)?12:$endSpecTime;//结束小时分隔(24小时制)
array_push($message, 'x_1 初始开始时间:'.date('Y-m-d H:i:s', $startTimeStamp));
//获取当前时间小时
$currentHour = date('H', $startTimeStamp);
array_push($message, 'x_1 currentHour:'.$currentHour);
// /if(empty(intval($currentHour)))$currentHour = $endSpecTime;
$startTimeStamp = mktime($currentHour, 0,0, date('m', $startTimeStamp), date('d', $startTimeStamp), date('Y', $startTimeStamp));
array_push($message, 'x_1 整理后开始时间:'.date('Y-m-d H:i:s', $startTimeStamp));
array_push($message, 'x_2 初始结束时间:'.date('Y-m-d H:i:s', $endTimeStamp));
$endTimeStamp = mktime($endSpecTime, 0 , 0, date('m', $endTimeStamp), date('d', $endTimeStamp), date('Y', $endTimeStamp));
array_push($message, 'x_2 整理后 结束时间'.date('Y-m-d H:i:s', $endTimeStamp));
if($startTimeStamp>=$endTimeStamp)
throw new \Exception('退房时间需大于入驻时间', -1);
$_x = ($currentHour < $this->startSpecTime)?true:false;
array_push($message, 'currentHour:'.$currentHour.' | eparateStrtHour:'.$this->startSpecTime);
//比对时间差
$diffDay = ($endTimeStamp - $startTimeStamp)/3600/24;
$spaceDay = 1;
if($_x){
/**
* 结算到当天(订房时间在分隔时间之前)
* 则退房日期算当天且消费为1天
* **/
$spaceDay = ceil($diffDay);
}else{
/**
* 结算到第二天(订房时间在分隔时间之后)
* 不到一天按一天算
* **/
$spaceDay = intval($diffDay);
if($spaceDay<=0){
$spaceDay = 1;
}
}
array_push($message, 'diffDay:['.$diffDay.'] | spaceDay:['.$spaceDay.']');
/***
* 住房时间段
* **/
$checkInDateList = [];
$loopNum = ($_x)?$spaceDay:$spaceDay+1;
for($i = 0; $i<$loopNum; $i++ ){
if($i==0){
$itemStart = mktime($currentHour, 0, 1, date('m', $startTimeStamp), date('d', $startTimeStamp)+$i, date('Y', $startTimeStamp));
$itemEnd = mktime($endSpecTime, 0, 0, date('m', $startTimeStamp), date('d', $startTimeStamp), date('Y', $startTimeStamp));
}else if($i==($loopNum-1)){
$itemStart = mktime($endSpecTime, 0, 1, date('m', $startTimeStamp), date('d', $startTimeStamp)+$i-1, date('Y', $startTimeStamp));
$itemEnd = mktime($endSpecTime, 0, 0, date('m', $endTimeStamp), date('d', $endTimeStamp), date('Y', $endTimeStamp));
}else{
$itemStart = mktime($endSpecTime, 0, 1, date('m', $startTimeStamp), date('d', $startTimeStamp), date('Y', $startTimeStamp));
$itemEnd = mktime($endSpecTime, 0, 0, date('m', $startTimeStamp), date('d', $startTimeStamp)+$i, date('Y', $startTimeStamp));
}
array_push($checkInDateList, [$itemStart, $itemEnd]);
}
return [
'startTime'=>$startTimeStamp,//开始时间
'endTime' => $endTimeStamp,//结束时间
'separateStartHour' => $this->startSpecTime,//开始分隔时间
'separateEndHour'=>$this->endSpecTime,//结束分隔时间
'diffDay'=>$spaceDay,//相差天数
'settMent'=>($_x)?'第一天结算到当天':'第一天结算到第二天',//结算是当天还是第二天
'dateList'=>$checkInDateList,
'message'=>'<br>'.join('<br>', $message).'<br>'
];
}
}
评论0
最新资源