[英]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.