问题描述
我有一个表,OperatingHours,其中记录了一周中某天(星期一、星期二、星期三到星期日)的 7 行数据。还有一个数据列,用户可以在其中设置诊所是否在一周内营业。
我想生成一个从当前日期到年底的日期列表,到诊所营业的那一天。目前以下是我的方法的控制器代码,我收到以下错误:
DateTime::modify(): 解析时间字符串失败(这个 [{"day":"Monday"},{"day":"Tuesday"},{"day":"Wednesday"},{"day":"Thursday"},{"day":"Friday"} ]) 在位置 0 (t):在数据库中找不到时区
public function index(){
$operatingDays = OperatingHour::where('clinic_open',true)->get('day');
$currentDate = Carbon::Now()->toDateTimeString();
$endOfYear - Carbon::Now()->endOfYear()->toDateTimeString();
$dt = $this->getWorkDayInRange($operatingDays,$currentDate,$endOfYear);
$data = [
'dt' = $dt,];
return view('appointment',$data);
}
public function getWorkDayInRange($workday,$fromDate,$toDate){
$dates = [];
$startDate = Carbon::parse($fromDate)->modify("this $workday");
$endDate = Carbon::parse($toDate);
//lte = less than or equal
for ($date = $startDate; $date->lte($endDate); $date->addWeek()) {
$dates[] = $date->toDateString();
}
return $dates;
}
解决方法
我最近用过类似的东西,看看这个:
function generateDateRange($start,$end){
$result = []
$end = = strtotime($end);
$current = = strtotime($start);
while( $current <= $end ) {
$result[] = date('Y-m-d',$current);
$current = strtotime('+1 day',$current);
}
return $result;
}
,
我已设法根据我的营业时间详细信息和假期表检索出日期列表。
以下是我对代码所做的更改。
private function getHolidays()
{
$holidaysList = Holiday::where('clinic_id','=',$_SESSION['clinic_ID'])->get();
$holidayArray = json_decode($holidaysList,true);
foreach($holidayArray as $holiday){
//Convert each data from table to Y-m-d format to compare
$holidays[] = date('Y-m-d',strtotime($holiday['date']));
// $holidays[] = $holiday['date'];
}
return $holidays;
}
public function getWorkDayInRange($workday,$dateFrom,$dateTo)
{
$holidays = $this->getHolidays();
$startDate = new DateTime($dateFrom);
$endDate = new DateTime($dateTo);
$interval = new DateInterval('P1D');
$dateRange = new DatePeriod($startDate,$interval,$endDate);
$results = [];
foreach ($dateRange as $date) {
$name = $date->format('l');
if (in_array($name,$workday) && !in_array($date->format('Y-m-d'),$holidays)) {
$results[] = $date->format('Y-m-d');
}
}
return $results;
}