2017-11-28 11 views
0

私は予約システムを作成しています。このシステムでは、ユーザーAは個人利用可能時間をデータベースに挿入できます。私はstart_timeend_timeのようにこれらをタイムスタンプとしてMySqlデータベースに保存しています。ユーザーが00:00:00の間の時間を選択すると、14:00:00というコードは完全に機能します。私は30分の間隔を生成し、時間を格納します。ユーザーが選択したときに、00:00:0000:00:00またはmidnightの場合は、正しいDatePeriodが得られますが、これを30分間隔で分割すると、最後の時刻が現在の日付で00:00:00と表示されますが、次の日になるのは00:00:00です。PHP DatePeriodが期待どおりに機能しない

これは私が現時点で持っているものです。

//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); 
    } 

私は真夜中から真夜中まで選択すると、私はこのjson$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 
} 

から返されたが、私のforeach($available_times_date_range as $available_date)に私のような応答をゲットこれは:

[ 
    { 
     "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最後のend_time2017-12-01 00:00:00である必要があります。それをどうすれば実現できますか?

答えて

2

$available_dateを終了日に変更しても問題は発生しますが、終了日には発生しません。フォーマットされた日付を配列に追加する前に、間隔を追加します。

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") 
    ]; 
} 

個人的に、私は

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"), 
    ]; 
} 

+0

ありがとうございました!一日中それで賑わっていましたが、その結果はとても簡単でした。再度、感謝します – raqulka

0

こんにちは、それは非常に簡単です(このようなことクローニングはPHP7を必要とします)若干異なる/時間終了日を設定することを好むだろう

終了日の計算には、このようにすることができます。

'end_time' => $available_date->add($interval)->format("Y-m-d H:i:s") 
あなたのケースで

はあなたはそれが次の更新コードはワールすべき問題

を引き起こしていた、古い日付を印刷し、後で間隔を追加

//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); 

サンプル出力

私はこれが役立つことを願っています
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 
     ) 

) 

関連する問題