Reputation: 1028
I am creating a booking system where user A can insert personal available times in the database. I am storing these as timestamp in MySql database as start_time
and end_time
. If user selects times between 00:00:00
to lets say 14:00:00
my code works perfectly. I generate a 30 minutes interval and store the times. Now when user selects lets say a whole day 00:00:00
to 00:00:00
or midnight
then I get the correct DatePeriod
, but when I split this into 30 minute intervals it shows the last time as current date and 00:00:00
but what I would need is the end date to be next days 00:00:00
.
This is what I have at the moment:
//get variables
$start_date = Input::get('start');
$end_date = Input::get('end');
$startDate = new DateTime($start_date);
$endDate = new DateTime($end_date);
$interval = new DateInterval('PT30M'); //interval of 30 minutes
$available_times_date_range = new DatePeriod($startDate, $interval ,$endDate);
//store the times in array
foreach($available_times_date_range as $available_date){
$dates_and_times[] = [
'start_time' => $available_date->format("Y-m-d")." ".$available_date->format("H:i:s"),
'end_time' => $available_date->format("Y-m-d")." ".$available_date->add($interval)->format("H:i:s")
];
}
//insert to database
foreach ($dates_and_times as $date_and_time) {
$test[] = $date_and_time['end_time'];
$start_time = $date_and_time['start_time'];
$end_time = $date_and_time['end_time'];
//insert
// Nanny_availability::addAvailability($start_time, $end_time);
}
When I select from midnight to midnight I get this json
returned from $available_times_date_range
{
"start":{
"date":"2017-11-30 00:00:00.000000",
"timezone_type":3,
"timezone":"Europe\/Helsinki"
},
"current":{
"date":"2017-12-01 00:00:00.000000",
"timezone_type":3,
"timezone":"Europe\/Helsinki"
},
"end":{
"date":"2017-12-01 00:00:00.000000",
"timezone_type":3,
"timezone":"Europe\/Helsinki"
},
"interval":{
"y":0,
"m":0,
"d":0,
"h":0,
"i":30,
"s":0,
"weekday":0,
"weekday_behavior":0,
"first_last_day_of":0,
"invert":0,
"days":false,
"special_type":0,
"special_amount":0,
"have_weekday_relative":0,
"have_special_relative":0
},
"recurrences":1,
"include_start_date":true
}
but in my foreach($available_times_date_range as $available_date)
I get the response like this:
[
{
"start_time":"2017-11-30 00:00:00",
"end_time":"2017-11-30 00:30:00"
},
//all the other objects
{
"start_time":"2017-11-30 23:30:00",
"end_time":"2017-11-30 00:00:00"
}
]
So the last end_time
should be 2017-12-01 00:00:00
. How can I achieve that?
Upvotes: 0
Views: 824
Reputation: 1219
Hi it is pretty simple
For calculating end date u can do like this
'end_time' => $available_date->add($interval)->format("Y-m-d H:i:s")
in your case your printing old date and adding interval later, that was causing the problem
following update code should worl
//get variables
$start_date = '2017-11-30 00:00:00.000000';
$end_date = '2017-12-01 00:00:00.000000';
$startDate = new DateTime($start_date);
$endDate = new DateTime($end_date);
$interval = new DateInterval('PT30M'); //interval of 30 minutes
$available_times_date_range = new DatePeriod($startDate, $interval ,$endDate);
//store the times in array
foreach($available_times_date_range as $available_date){
$dates_and_times[] = [
'start_time' => $available_date->format("Y-m-d")." ".$available_date->format("H:i:s"),
'end_time' => $available_date->add($interval)->format("Y-m-d H:i:s")
];
}
print_r($dates_and_times);
Sample Output
Array
(
[0] => Array
(
[start_time] => 2017-11-30 00:00:00
[end_time] => 2017-11-30 00:30:00
)
[1] => Array
(
[start_time] => 2017-11-30 00:30:00
[end_time] => 2017-11-30 01:00:00
)
[2] => Array
(
[start_time] => 2017-11-30 01:00:00
[end_time] => 2017-11-30 01:30:00
)
[3] => Array
(
[start_time] => 2017-11-30 01:30:00
[end_time] => 2017-11-30 02:00:00
)
[4] => Array
(
[start_time] => 2017-11-30 02:00:00
[end_time] => 2017-11-30 02:30:00
)
[5] => Array
(
[start_time] => 2017-11-30 02:30:00
[end_time] => 2017-11-30 03:00:00
)
[6] => Array
(
[start_time] => 2017-11-30 03:00:00
[end_time] => 2017-11-30 03:30:00
)
[7] => Array
(
[start_time] => 2017-11-30 03:30:00
[end_time] => 2017-11-30 04:00:00
)
[8] => Array
(
[start_time] => 2017-11-30 04:00:00
[end_time] => 2017-11-30 04:30:00
)
[9] => Array
(
[start_time] => 2017-11-30 04:30:00
[end_time] => 2017-11-30 05:00:00
)
[10] => Array
(
[start_time] => 2017-11-30 05:00:00
[end_time] => 2017-11-30 05:30:00
)
[11] => Array
(
[start_time] => 2017-11-30 05:30:00
[end_time] => 2017-11-30 06:00:00
)
[12] => Array
(
[start_time] => 2017-11-30 06:00:00
[end_time] => 2017-11-30 06:30:00
)
[13] => Array
(
[start_time] => 2017-11-30 06:30:00
[end_time] => 2017-11-30 07:00:00
)
[14] => Array
(
[start_time] => 2017-11-30 07:00:00
[end_time] => 2017-11-30 07:30:00
)
[15] => Array
(
[start_time] => 2017-11-30 07:30:00
[end_time] => 2017-11-30 08:00:00
)
[16] => Array
(
[start_time] => 2017-11-30 08:00:00
[end_time] => 2017-11-30 08:30:00
)
[17] => Array
(
[start_time] => 2017-11-30 08:30:00
[end_time] => 2017-11-30 09:00:00
)
[18] => Array
(
[start_time] => 2017-11-30 09:00:00
[end_time] => 2017-11-30 09:30:00
)
[19] => Array
(
[start_time] => 2017-11-30 09:30:00
[end_time] => 2017-11-30 10:00:00
)
[20] => Array
(
[start_time] => 2017-11-30 10:00:00
[end_time] => 2017-11-30 10:30:00
)
[21] => Array
(
[start_time] => 2017-11-30 10:30:00
[end_time] => 2017-11-30 11:00:00
)
[22] => Array
(
[start_time] => 2017-11-30 11:00:00
[end_time] => 2017-11-30 11:30:00
)
[23] => Array
(
[start_time] => 2017-11-30 11:30:00
[end_time] => 2017-11-30 12:00:00
)
[24] => Array
(
[start_time] => 2017-11-30 12:00:00
[end_time] => 2017-11-30 12:30:00
)
[25] => Array
(
[start_time] => 2017-11-30 12:30:00
[end_time] => 2017-11-30 13:00:00
)
[26] => Array
(
[start_time] => 2017-11-30 13:00:00
[end_time] => 2017-11-30 13:30:00
)
[27] => Array
(
[start_time] => 2017-11-30 13:30:00
[end_time] => 2017-11-30 14:00:00
)
[28] => Array
(
[start_time] => 2017-11-30 14:00:00
[end_time] => 2017-11-30 14:30:00
)
[29] => Array
(
[start_time] => 2017-11-30 14:30:00
[end_time] => 2017-11-30 15:00:00
)
[30] => Array
(
[start_time] => 2017-11-30 15:00:00
[end_time] => 2017-11-30 15:30:00
)
[31] => Array
(
[start_time] => 2017-11-30 15:30:00
[end_time] => 2017-11-30 16:00:00
)
[32] => Array
(
[start_time] => 2017-11-30 16:00:00
[end_time] => 2017-11-30 16:30:00
)
[33] => Array
(
[start_time] => 2017-11-30 16:30:00
[end_time] => 2017-11-30 17:00:00
)
[34] => Array
(
[start_time] => 2017-11-30 17:00:00
[end_time] => 2017-11-30 17:30:00
)
[35] => Array
(
[start_time] => 2017-11-30 17:30:00
[end_time] => 2017-11-30 18:00:00
)
[36] => Array
(
[start_time] => 2017-11-30 18:00:00
[end_time] => 2017-11-30 18:30:00
)
[37] => Array
(
[start_time] => 2017-11-30 18:30:00
[end_time] => 2017-11-30 19:00:00
)
[38] => Array
(
[start_time] => 2017-11-30 19:00:00
[end_time] => 2017-11-30 19:30:00
)
[39] => Array
(
[start_time] => 2017-11-30 19:30:00
[end_time] => 2017-11-30 20:00:00
)
[40] => Array
(
[start_time] => 2017-11-30 20:00:00
[end_time] => 2017-11-30 20:30:00
)
[41] => Array
(
[start_time] => 2017-11-30 20:30:00
[end_time] => 2017-11-30 21:00:00
)
[42] => Array
(
[start_time] => 2017-11-30 21:00:00
[end_time] => 2017-11-30 21:30:00
)
[43] => Array
(
[start_time] => 2017-11-30 21:30:00
[end_time] => 2017-11-30 22:00:00
)
[44] => Array
(
[start_time] => 2017-11-30 22:00:00
[end_time] => 2017-11-30 22:30:00
)
[45] => Array
(
[start_time] => 2017-11-30 22:30:00
[end_time] => 2017-11-30 23:00:00
)
[46] => Array
(
[start_time] => 2017-11-30 23:00:00
[end_time] => 2017-11-30 23:30:00
)
[47] => Array
(
[start_time] => 2017-11-30 23:30:00
[end_time] => 2017-12-01 00:00:00
)
)
I hope this will help
Upvotes: 1
Reputation: 212452
The problem arises with your modification of $available_date
for the end time, but not the end date. Add the interval before adding the formatted date to your array.
foreach($available_times_date_range as $available_date){
$dates_and_times[] = [
'start_time' => $available_date->format("Y-m-d")." ".$available_date->format("H:i:s"),
'end_time' => $available_date->add($interval)->format("Y-m-d")." ".$available_date->format("H:i:s")
];
}
Personally, I'd prefer to set end date/time slightly differently
foreach($available_times_date_range as $available_date){
$endTime = (clone $available_date)->add($interval);
$dates_and_times[] = [
'start_time' => $available_date->format("Y-m-d H:i:s"),
'end_time' => $endTime->format("Y-m-d H:i:s"),
];
}
(note that cloning like this requires PHP7)
Upvotes: 2