I have a system that accepts user submissions, and upon receiving a submission the system will go through all timeslots to find the appropriate timeslot. The problem is that it needs to be able to check against the start & end times if the end time laps to the next day.
Take the following example: A timeslot begins at 10:30 PM on the current day and ends at 4:00 PM the next day. If the current time is between 10:30 PM and 11:59:59 PM, the submission will be assigned to that timeslot. However, if the current time is between 12:00 AM and 4:00 PM then it will skip the timeslot.
This is what I have so far:
function check_time($from, $to, $time) {
$time = strtotime($time);
$from = strtotime($from);
$to_ = strtotime($to);
$to = $to_ <= $from ? strtotime($to . " tomorrow") : $to_;
return ($time >= $from && $time <= $to);
}
$timeslots = array(
array("16:00:00", "22:30:00"),
array("22:30:00", "16:00:00")
);
foreach ($timeslots as $slot) {
if (check_time($slot[0], $slot[1], date("H:i:s")))
{
echo "true\n";
}
else
{
echo "false\n";
}
}
If the current time is 23:00:00, then the result would be
false
true
But if the current time is 12:00:00 then the result would be
false
false
even though it's technically between the two times.
I know it has to do with the fact that if it's a new day, then the strtotime
result for $from
will be later in the day. So instead of checking for 10:30 PM yesterday, it checks for 10:30 PM tonight.
My problem is that I cannot seem to come up with a way to make the $from
time switch to the previous day if it needs to, similar to how I force the $to
time into the next day.
This is much easier than you expect. Assume that you have three times,
t1
,t2
andtn
which represent from, to and user time respectively. Treat these times as six digit numbers (from 000000 to 235959) and check:t1
andt2
are present on the same side of midnight boundarytn
lies betweent1
andt2
tn
does not lie betweent2
andt1
Code and tests:
I cheated! Let's follow the logic:
$time
you want to test and made it an integer.$threshold
which is the date that breaks spaces the slots.$time
integer is before or after the$threshold
.If it fails (bad input) it
returns false
. If it succeeds it returns an integer: - 1 if before the threshold - 2 if after the thresholdHope it fits your needs.