Php 周末日期范围分割
我有一个CakePHP应用程序,它被用作我们公司日常活动的中心门户。这些包括各种预订系统和信息,如员工及其部门。系统运行cakephp2.2 我目前正在实施的是一个系统,招标人可以申请起草合同。本合同有各种变化,这取决于合同草案应在(投标)截止日期前多久移交给法人,以起草正式合同。然后,该系统在该合同成立的几天内“登记”法人。在那几天不能进行其他预订 该系统运行良好,但不会在一个周末内拆分合同。它将所有的日期移动到周末之前。比如说,为了便于辩论,我订了一份合同草案,将于6月18日完成。系统确定总合同时间为3天。这意味着合同将在一个周末到期,并将在6月13日、14日和17日到期(而不是18日,因为我需要在那时完成文件)。但是,该系统将于6月12日至14日关闭 很抱歉读了这么长时间,但我宁愿让你知道整个故事,而不是零零碎碎的。以下是我的系统代码:Php 周末日期范围分割,php,date,cakephp-2.2,Php,Date,Cakephp 2.2,我有一个CakePHP应用程序,它被用作我们公司日常活动的中心门户。这些包括各种预订系统和信息,如员工及其部门。系统运行cakephp2.2 我目前正在实施的是一个系统,招标人可以申请起草合同。本合同有各种变化,这取决于合同草案应在(投标)截止日期前多久移交给法人,以起草正式合同。然后,该系统在该合同成立的几天内“登记”法人。在那几天不能进行其他预订 该系统运行良好,但不会在一个周末内拆分合同。它将所有的日期移动到周末之前。比如说,为了便于辩论,我订了一份合同草案,将于6月18日完成。系统确定总
$tenderDocument = $this->TenderDocument->read(null,$id);
$deadline = $tenderDocument['TenderDocument']['required_date'];
$deadline = $start = date('Y-m-d',strtotime('-1 day',strtotime($deadline)));
$start = date('Y-m-d',strtotime('-' . $tenderDocument['ContractForm']['time'],strtotime($deadline)));
$dates[] = $current = $start;
while($current < $deadline){
$current = date('Y-m-d',strtotime('+1 day',strtotime($current)));
$dates[] = $current;
}
$is_available = array();
$is_available = $this->TenderDocument->find('first',
array(
'conditions' => array(
'(TenderDocument.start_date >= "' . $start . '" AND
TenderDocument.start_date < "' . $deadline . '" OR
TenderDocument.start_date <= "' . $deadline . '" AND
TenderDocument.required_date > "' . $deadline . '") AND
TenderDocument.id != ' . $id
)
)
);
$is_weekend = false;
foreach($dates as $date) {
if(date('l',strtotime($date)) == 'Sunday' || date('l',strtotime($date)) == 'Saturday') {
$is_weekend = true;
}
}
while(!empty($is_available) || $is_weekend) {
$is_weekend = false;
$dates = array();
$deadline = date('Y-m-d',strtotime('-1 day',strtotime($deadline)));
$start = date('Y-m-d',strtotime('-1 day',strtotime($start)));
$dates[] = $current = $start;
while($current < $deadline){
$current = date('Y-m-d',strtotime('+1 day',strtotime($current)));
$dates[] = $current;
}
foreach($dates as $date) {
if(date('l',strtotime($date)) == 'Sunday' || date('l',strtotime($date)) == 'Saturday') {
$is_weekend = true;
}
}
$is_available = $this->TenderDocument->find('first',
array(
'conditions' => array(
'(TenderDocument.start_date >= "' . $start . '" AND
TenderDocument.start_date < "' . $deadline . '" OR
TenderDocument.start_date <= "' . $deadline . '" AND
TenderDocument.required_date > "' . $deadline . '") AND
TenderDocument.id != ' . $id
)
)
);
}
$tenderDocument=$this->tenderDocument->read(null,$id);
$deadline=$tenderDocument['tenderDocument']['required_date'];
$deadline=$start=date('Y-m-d',标准时间('-1天',标准时间('deadline));
$start=日期('Y-m-d',标准时间('-'.$tenderDocument['ContractForm']['time'],标准时间('deadline));
$dates[]=$current=$start;
而($当前<$截止日期){
$current=日期('Y-m-d',标准时间('+1天',标准时间($current));
$dates[]=$current;
}
$is_available=array();
$is_available=$this->TenderDocument->find('first'),
排列(
“条件”=>数组(
“(TenderDocument.start_date>=”.$start.”和
投标文件。开始日期<“.$截止日期”。”或
招标文件。开始日期“.$deadline.”)和
TenderDocument.id!='.$id
)
)
);
$is_weekend=false;
foreach($日期作为$日期){
如果(日期('l',strotime($date))='Sunday'| |日期('l',strotime($date))=='Saturday'){
$is_weekend=true;
}
}
而(!empty($is_可用)| |$is_周末){
$is_weekend=false;
$dates=array();
$deadline=日期('Y-m-d',标准时间('-1天',标准时间('deadline));
$start=日期('Y-m-d',标准时间('-1天',标准时间($start));
$dates[]=$current=$start;
而($当前<$截止日期){
$current=日期('Y-m-d',标准时间('+1天',标准时间($current));
$dates[]=$current;
}
foreach($日期作为$日期){
如果(日期('l',strotime($date))='Sunday'| |日期('l',strotime($date))=='Saturday'){
$is_weekend=true;
}
}
$is_available=$this->TenderDocument->find('first'),
排列(
“条件”=>数组(
“(TenderDocument.start_date>=”.$start.”和
投标文件。开始日期<“.$截止日期”。”或
招标文件。开始日期“.$deadline.”)和
TenderDocument.id!='.$id
)
)
);
}
另一方面,是否有任何方法可以简化/最小化此代码?我希望我正确理解您的问题,您需要根据合同应运行的天数计算合同的结束日期,而不将周末计算为工作日 PHP的类可以大大简化代码。我认为此功能将帮助您:-
/**
* Given the start date of a contract will return the end date, skipping weekends
*
* @param String $starDate format 'Y-m-d'
* @param Int $numberOfDays Number of working days
* @return Array of date strings
*/
function getDeadline($starDate, $numberOfDays)
{
$start = \DateTime::createFromFormat('Y-m-d', $starDate);
$interval = new DateInterval('P1D');
$result = array();
$i = 0;
while($i < $numberOfDays){
if((int)$start->format('N') < 6){
$result[] = $start->format('Y-m-d');
$i++;
}
$start->add($interval);
}
return $result;
}
$start = '2013-6-12';
var_dump(getDeadline($start, 4));
我希望我能正确理解您的问题,您需要根据合同应运行的天数计算合同的结束日期,而不将周末计算为工作日 PHP的类可以大大简化代码。我认为此功能将帮助您:-
/**
* Given the start date of a contract will return the end date, skipping weekends
*
* @param String $starDate format 'Y-m-d'
* @param Int $numberOfDays Number of working days
* @return Array of date strings
*/
function getDeadline($starDate, $numberOfDays)
{
$start = \DateTime::createFromFormat('Y-m-d', $starDate);
$interval = new DateInterval('P1D');
$result = array();
$i = 0;
while($i < $numberOfDays){
if((int)$start->format('N') < 6){
$result[] = $start->format('Y-m-d');
$i++;
}
$start->add($interval);
}
return $result;
}
$start = '2013-6-12';
var_dump(getDeadline($start, 4));
我用了完全不同的方式 我收到了required by date,创建了一个2个月的日期范围,然后从数组中删除了所有周六和周日以及已预订的天数。然后我反向排序,选择第一个需要的天数
function _createDateRangeArray($strDateFrom,$strDateTo) {
$aryRange=array();
$iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2), substr($strDateFrom,8,2),substr($strDateFrom,0,4));
$iDateTo=mktime(1,0,0,substr($strDateTo,5,2), substr($strDateTo,8,2),substr($strDateTo,0,4));
if ($iDateTo>=$iDateFrom)
{
array_push($aryRange,date('Y-m-d',$iDateFrom)); // first entry
while ($iDateFrom<$iDateTo)
{
$iDateFrom+=86400; // add 24 hours
array_push($aryRange,date('Y-m-d',$iDateFrom));
}
}
return $aryRange;
}
public function confirm($id = null) {
if($this->request->is('post')) {
$this->TenderDocument->create();
$data = array(
'TenderDocument' => array(
'id' => $id,
'book_dates' => implode(',',$this->request->data['TenderDocument']['book_days'])
)
);
if($this->TenderDocument->save($data)) {
$this->_sendTenderDocument($id);
$this->Session->setFlash('Tender document request saved.','default',array('class'=>'notification'));
$this->redirect(array('action'=>'add'));
} else {
$this->Session->setFlash('There was an error saving your deadline. Please retry.','default',array('class'=>'error'));
}
}
$this->TenderDocument->id = $id;
if (!$this->TenderDocument->exists()) {
throw new NotFoundException(__('Invalid tender document'));
}
$tenderDocument = $this->TenderDocument->read(null,$id);
$deadline = $tenderDocument['TenderDocument']['required_date']; // Deadline date as entered on form
$deadline = $start = date('Y-m-d',strtotime('-1 day',strtotime($deadline))); // adjusted deadline
$start = date('Y-m-d',strtotime('-3 months',strtotime($deadline))); // adjusted start
$period = $this->_createDateRangeArray($start,$deadline);
$TenderDocuments = $this->TenderDocument->find('list',
array(
'fields' => array('TenderDocument.book_dates')
)
);
$dates = array();
foreach($TenderDocuments as $TenderDocument) {
$doc_dates = explode(',',$TenderDocument);
foreach($doc_dates as $doc_date) {
$dates[] = $doc_date;
}
}
foreach($period as $key=>$value) {
if(date('l',strtotime($value)) == 'Saturday' || date('l',strtotime($value)) == 'Sunday' || in_array($value,$dates)) {
unset($period[$key]);
}
}
rsort($period);
for($k = 0; $k <= $tenderDocument['ContractForm']['time']; $k++) {
$book_days[] = $period[$k];
}
$this->set('TenderDocument',$this->TenderDocument->read(null,$id));
$this->set('book_days',$book_days);
}
函数_createDateRangeArray($strDateFrom,$strDateTo){
$aryRange=array();
$iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2),substr($strDateFrom,8,2),substr($strDateFrom,0,4));
$iDateTo=mktime(1,0,0,substr($strDateTo,5,2),substr($strDateTo,8,2),substr($strDateTo,0,4));
如果($iDateTo>=$iDateFrom)
{
数组推送($aryRange,date($Y-m-d',$iDateFrom));//第一个条目
而($iDateFromrequest->is('post')){
$this->TenderDocument->create();
$data=数组(
'TenderDocument'=>数组(
'id'=>$id,
'book_dates'=>内爆(',',$this->request->data['TenderDocument']['book_days'])
)
);
如果($this->TenderDocument->save($data)){
$this->\u sendTenderDocument($id);
$this->Session->setFlash('保存招标文件请求','default',数组('class'=>'notification');
$this->redirect(数组('action'=>'add');
}否则{
$this->Session->setFlash('保存截止日期时出错。请重试','default',array('class'=>'error');
}
}
$this->TenderDocument->id=$id;
如果(!$this->TenderDocument->exists()){
抛出新的NotFoundException(uuuuuuu(“无效投标文件”);
}
$tenderDocument=$this->tenderDocument->read(null,$id);
$deadline=$tenderDocument['tenderDocument']['required_date'];//表格中输入的截止日期
$deadline=$start=date('Y-m-d',strottime('-1天',strottime('deadline));//调整后的截止日期
$start=date('Y-m-d',strottime('-3个月',strottime($deadline));//调整后的开始时间
$period=$this->\u createDateRangeArray($start,$deadline);
$TenderDocuments=$