英文:
Can't figure out how to correctly check if there is an appointment in between times with Carbon and Laravel
问题
以下是您要翻译的内容:
This might be much simpler than i think it is, but i've scratched my head around it for a while now. Probably too long, and stuck with the same wrong solutions to get outside my own head.
So i could use some help.
I'm constructing an appointment system, and lets say that an appointment is 1 hour long. Between 12-13. I can make sure that no appointments are started during that time. But, my problem is. If i create an appointment and that is 2 hours long. Then, right now someone can book it at 11.30, since it will finish at 13.30. Which obviously shouldn't be possible, because there is an appointment in between.
I will supply my current code below, and hope that some of you, hopefully smarter for me can see, what probably is an easy solution. I have removed all my testcode, since they have not shown any promise.
在最后,所有不可能的时间都将保存在$busy_times中,然后我将运行以下代码来显示任何可用时间。
UPDATE
Here is the solution code added to the above, from the correct answer below, if anyone else wonders.
英文:
This might be much simpler than i think it is, but i've scratched my head around it for a while now. Probably too long, and stuck with the same wrong solutions to get outside my own head.
So i could use some help.
I'm constructing an appointment system, and lets say that an appointment is 1 hour long. Between 12-13. I can make sure that no appointments are started during that time. But, my problem is. If i create an appointment and that is 2 hours long. Then, right now someone can book it at 11.30, since it will finish at 13.30. Which obviously shouldn't be possible, because there is an appointment in between.
I will supply my current code below, and hope that some of you, hopefully smarter for me can see, what probably is an easy solution. I have removed all my testcode, since they have not shown any promise.
$intervals = CarbonInterval::minutes('15')->toPeriod($start, $end);
foreach ($intervals as $time) {
$this_time = Carbon::parse($time)->tz('Europe/Stockholm');
$current_mission_end_from_time = Carbon::parse(roundToNearestMinuteInterval($this_time->addMinutes($current_mission_length)));
if ($busy_between->isNotEmpty()) {
foreach ($busy_between as $busy) {
if ($time->between($busy['start'], $busy['end'])) {
$busy_times->add($time->format('H:i'));
}
}
}
}
In the end, all non-possible times will be saved to $busy_times, then i will run this code to show any free times.
foreach ($intervals as $time) {
if (!$busy_times->contains($time->format('H:i'))) {
$free_times->add($time->format('H:i'));
}
}
UPDATE
Here is the solution code added to the above, from the correct answer below, if anyone else wonders.
if ($busy_between->isNotEmpty()) {
foreach ($busy_between as $busy) {
if ($time->between($busy['start'], $busy['end'])) {
$busy_times->add($time->format('H:i'));
}
$exitingAppointment = CarbonPeriod::create($busy['start'], $busy['end']);
$appointmentTentative = CarbonPeriod::create($time, $current_mission_end_from_time);
if ($exitingAppointment->overlaps($appointmentTentative)) {
$busy_times->add($time->format('H:i'));
}
}
}
答案1
得分: 1
使用 Carbon\CarbonPeriod::overlaps
:
$exitingAppointment = \Carbon\CarbonPeriod::create('2023-02-26 12:00', '2023-02-26 13:00');
$appointmentTentative = \Carbon\CarbonPeriod::create('2023-02-26 11:30', '2023-02-26 13:30');
if ($exitingAppointment->overlaps($appointmentTentative)) {
echo "No: overlaps with existing appointment\n";
} else {
echo "All good\n";
}
请注意,我已经将代码部分保留在英文原文中。
英文:
Use Carbon\CarbonPeriod::overlaps
:
$exitingAppointment = \Carbon\CarbonPeriod::create('2023-02-26 12:00', '2023-02-26 13:00');
$appointmentTentative = \Carbon\CarbonPeriod::create('2023-02-26 11:30', '2023-02-26 13:30');
if ($exitingAppointment->overlaps($appointmentTentative)) {
echo "No: overlaps with existing appointment\n";
} else {
echo "All good\n";
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论