簡體   English   中英

Laravel:從 Carbon\\CarbonPeriod 中跳過一些時間范圍的時間段

[英]Laravel: Skip time slots from Carbon\CarbonPeriod some time ranges

我正在為各種套餐開發一個預訂系統,每個套餐都有不同的持續時間。 客戶應該從選定的日期獲得可用的時間段。 日期可能包含具有不同時間間隔的不同套餐預訂。 所以,我想要做的是通過跳過所有預訂的時間段來提取日期的可用時間段。

預期輸出為:

08:00 AM
10:30 AM // 09:00 AM has a booking. and its duration is 1.5 hours
11:30 AM // The current package has 1 hour duration

... until the shop closes for eg 08:00 PM

我正在使用 CarbonPeriod 來獲取時間段列表。 但是,我無法應用過濾器來跳過所有預訂的時間段。

$hours = new CarbonPeriod(
    $opening,
    $this->duration() . ' minutes',
    $closing->subMinutes($this->duration())
);

$hours->filter(function ($date) use ($booked) {
    $toSkip = [];
    foreach ($booked as $bookedItem) {
        $bookingTime = Carbon::parse($bookedItem->time);
        $completingTime = Carbon::parse($bookedItem->time)->addMinutes($bookedItem->package->duration());

        if ($date->isBetween($bookingTime, $completingTime)) {
            array_push($toSkip, $date);
        }
    }
    return !in_array($date, $toSkip);
});

任何幫助將不勝感激!

如果您不想重新發明輪子,這聽起來像是spatie/opening-hours 的工作或專用於 Carbon 的版本: cmixin/business-time

定義如下:

BusinessTime::enable(Carbon::class, [
  'monday' => ['09:00-12:00', '13:00-18:00'],
  'tuesday' => ['09:00-12:00', '13:00-18:00'],
  'wednesday' => ['09:00-12:00'],
  'thursday' => ['09:00-12:00', '13:00-18:00'],
  'friday' => ['09:00-12:00', '13:00-20:00'],
  'saturday' => ['09:00-12:00', '13:00-16:00'],
]);

然后使用CarbonPeriod ,使用自定義步驟:

$period = CarbonPeriod::create(
    $opening,
    static fn ($date) => $date->nextOpen(),
    $closing,
);

foreach ($period as $slot) {
  echo "$slot\n";
}

您還可以輕松地將 AM/PM 字符串轉換為 h0-23 格式:

Carbon::parse('11:20 PM')->format('H:i')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM