简体   繁体   中英

PHP DatePeriod not working as expected

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?

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)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM