【问题标题】:Laravel get list of dates based on days shop is open, within date rangeLaravel 根据日期范围内商店营业的天数获取日期列表
【发布时间】:2021-07-17 10:15:42
【问题描述】:

我有一个表 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;
}

【问题讨论】:

  • 您还想查看日期名称吗?
  • @YasinPatel yap 检查日期名称,并填写日期
  • getWorkDayInRange($operatingDays,... 传递数组 getWorkDayInRange($workday 期望工作日字符串 Failed to parse time string 错误消息会显示您传递的内容,因此很明显现在可以从数组 JSON 中获取任何正确的日期。跨度>

标签: php laravel php-carbon


【解决方案1】:

我最近用过类似的东西,看看这个:

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;
}

【讨论】:

  • 您好,感谢您的输入,我看了一下,但是它不能满足我的需要,它会检查 Clinic_open 为 true 的天数。有没有办法解决 $workday 的价值?
【解决方案2】:

我已经设法根据我的营业时间详细信息和假期表检索出日期列表。

以下是我对代码所做的更改。

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;

    }

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2019-02-23
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多