<?php
class BusinessDaysCalculator {
const MONDAY = 1;
const TUESDAY = 2;
const WEDNESDAY = 3;
const THURSDAY = 4;
const FRIDAY = 5;
const SATURDAY = 6;
const SUNDAY = 7;
/**
* @param DateTime $startDate Date to start calculations from
* @param DateTime[] $holidays Array of holidays, holidays are no conisdered business days.
* @param DateTime[] $nonBusinessDays Array of days of the week which are not business days.
* @param DateTime[] $specialBusinessDay Array is the special work day.
*/
public function __construct(DateTime $startDate, array $holidays, array $nonBusinessDays ,array $specialBusinessDay) {
$this->date = $startDate;
$this->holidays=[];
foreach($holidays as $holiday){
array_push($this->holidays,new DateTime($holiday));
}
$this->nonBusinessDays = $nonBusinessDays;
$this->specialBusinessDay = $specialBusinessDay;
}
public function addBusinessDays($howManyDays) {
$i = 0;
while ($i < $howManyDays) {
$this->date->modify("+1 day");
if ($this->isBusinessDay($this->date)) {
$i++;
}
}
}
public function getDate() {
return $this->date->format('Y-m-d');
}
private function isBusinessDay(DateTime $date) {
if(in_array($date->format('Y-m-d') , $this->specialBusinessDay)) return true; //判断当前日期是否是因法定节假日调休而上班的周末,这种情况也算工作日
if (in_array((int)$date->format('N'), $this->nonBusinessDays)) {
return false; //当前日期是周末
}
foreach ($this->holidays as $day) {
if ($date->format('Y-m-d') == $day->format('Y-m-d')) {
return false; //当前日期是法定节假日
}
}
return true;
}
}
$holidays=["2017-01-27","2017-01-28","2017-01-29","2017-01-30","2017-01-31","2017-02-01","2017-02-02"];//从聚合数据接口获得
$specialBusinessDay=["2017-01-22"];//因法定节假日调休而上班的周末,这种情况也算工作日.因为这种情况少,可以通过手动配置
$calculator = new BusinessDaysCalculator(
new DateTime(), //当前时间
$holidays,
[BusinessDaysCalculator::SATURDAY, BusinessDaysCalculator::SUNDAY],
$specialBusinessDay
);
$calculator->addBusinessDays(120); // 120个工作日后的时间
$afterBusinessDay=$calculator->getDate();
echo $afterBusinessDay;
这是来自于网络的,本地测试正常改写成TP扩展类就出现错误。
发现TP对datetime 支持性有点问题,改成time()时间缀械式。
<?php
class BusinessDaysCalculator {
const MONDAY = 1;
const TUESDAY = 2;
const WEDNESDAY = 3;
const THURSDAY = 4;
const FRIDAY = 5;
const SATURDAY = 6;
const SUNDAY = 0;
/**
* @param DateTime $startDate Date to start calculations from
* @param DateTime[] $holidays Array of holidays, holidays are no conisdered business days.
* @param DateTime[] $nonBusinessDays Array of days of the week which are not business days.
* @param DateTime[] $specialBusinessDay Array is the special work day.
*/
public function __construct(int $startDate, array $holidays, array $nonBusinessDays ,array $specialBusinessDay) {
$this->d = $startDate;
$this->holidays=[];
foreach($holidays as $holiday){
array_push($this->holidays,new DateTime($holiday));
}
$this->nonBusinessDays = $nonBusinessDays;
$this->specialBusinessDay = $specialBusinessDay;
}
public function addBusinessDays($howManyDays) {
$i = 0;
while ($i < $howManyDays) {
$this->d = $this->d+1*24*60*60;
if ($this->isBusinessDay($this->d)) {
$i++;
}
}
}
public function getDate() {
return $this->d;
}
private function isBusinessDay(int $d) {
if(in_array(date('Y-m-d',$d) , $this->specialBusinessDay)) return true; //判断当前日期是否是因法定节假日调休而上班的周末,这种情况也算工作日
if (in_array((int)date('w',$d), $this->nonBusinessDays)) {
return false; //当前日期是周末
}
foreach ($this->holidays as $day) {
if (date('Y-m-d',$d) == $day->format('Y-m-d')) {
return false; //当前日期是法定节假日
}
}
return true;
}
}
$holidays=["2017-01-27","2017-01-28","2017-01-29","2017-01-30","2017-01-31","2017-02-01","2017-02-02"];//从聚合数据接口获得
$specialBusinessDay=["2017-01-22"];//因法定节假日调休而上班的周末,这种情况也算工作日.因为这种情况少,可以通过手动配置
$calculator = new BusinessDaysCalculator(
time(), //当前时间
$holidays,
[BusinessDaysCalculator::SATURDAY, BusinessDaysCalculator::SUNDAY],
$specialBusinessDay
);
$calculator->addBusinessDays(120); // 120个工作日后的时间
$afterBusinessDay=$calculator->getDate();
echo date('Y-m-d H:i:s',$afterBusinessDay);
|