0

将来の数日間 (今日を含む) の午前 11 時と午後 4 時の時間枠を合計 8 つのオプションから選択する方法をユーザーに提供する必要があります。もちろん、今日の午前 11 時または午後 4 時を過ぎている場合は、期限切れのオプションを表示するべきではありません。

たとえば、現在が 2 月 28 日の正午である場合、次の 8 つのオプションをユーザーに表示する必要があります。

28-Feb-13 at 4pm 
01-Mar-13 at 11am 
01-Mar-13 at 4pm 
02-Mar-13 at 11am 
02-Mar-13 at 4pm 
03-Mar-13 at 11am 
03-Mar-13 at 4pm 
04-Mar-13 at 11am

また、これらのオプションをMySQLに保存して、選択した日付/時刻を登録情報とともにDBに保存する方法が必要です。

これは言葉で説明するのは簡単に思えますが、これを PHP でプログラムする方法を理解するのに非常に苦労しています。

DateTime()クラスを使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

0

以下のコードを試してみてください。DBにDATETIMEとして保存します。ニーズに基づいて最適化するのはあなた次第です。ロジックの基本的な考え方がわかります。

<?php
    $end_date = mktime(0, 0, 0, date("m")  , date("d")+4, date("Y"));
    $cnt = 0;
    $day = 0;

    $current_hour = date("H");
    // To test with various values, uncomment below line and assign any hour
    // $current_hour = "12";


    if($current_hour < 11)
    {
        $day = 0;
        $ts =  mktime(11, 0, 0, date("m")  , date("d"), date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);
        $ts =  mktime(16, 0, 0, date("m")  , date("d"), date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);
        $cnt = 2;
        $day = $day + 1;
    }
    elseif($current_hour < 16)
    {
        $day = 0;
        $ts =  mktime(16, 0, 0, date("m")  , date("d")+$day, date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);
        $cnt = 1;
        $day = $day + 1;
    }
    elseif($current_hour >= 16)
    {

        $day = $day + 1;
    }


    while($cnt <= 8)
    {
        $ts =  mktime(11, 0, 0, date("m")  , date("d")+$day, date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);
        $cnt = $cnt + 1;
        if($cnt >=8) break;

        $ts =  mktime(16, 0, 0, date("m")  , date("d")+$day, date("Y"));
        echo "<br>".date("Y-m-d H:i:s",$ts);    
        $cnt = $cnt + 1;
        $day = $day + 1;
        if($cnt >=8) break;
    }

    ?>
于 2013-02-27T12:33:21.980 に答える
0

「今」のdateTimeを作成し、午前11時より前かどうかを確認してから、時間を午前11時または午後4時に移動し、8つの値を取得するために増やす必要があります。

これは、このようなものを処理できるコードの一部です。

// create a "now" date time
$now = new DateTime();

// create a "now at 11am" date time
$nowAt11am = new DateTime();
$nowAt11am->setTime(11, 0, 0);

// Compare the interval between now and now at 11am
$interval = $now->diff($nowAt11am);

// Initialize the increment even/odd
$incementEvenOdd = 0;

// Check interval
if ($interval->invert == 1)
{
    // $interval < 0 => we are before $nowAt11am, set to 11 am
    $now = $nowAt11am;
    $incementEvenOdd = 0;
}
else
{
    // $interval > 0 => we are after $nowAt11am, set to 4 pm
    $now->setTime(16, 0, 0);
    $incementEvenOdd = 1;
}

$dayAndHours = array();
$dayAndHours[] = $now->format("your_desire_format");

// Loop and add the next 7 dates
for($i = 0 ; $i < 7 ; $i++)
{
    // Handle the delay between 11 am and 4 pm
    // 11am -> 4pm = + 5h
    // 4pm -> 11am = + 19h

    if ($incementEvenOdd % 2 == 0)
        $now->add(DateInterval::createFromDateString('5 hours'));
    else
        $now->add(DateInterval::createFromDateString('19 hours'));

    // Appen the next value
    $dayAndHours[] = $now->format("your_desire_format");

    // Update increment
    $incrementEvenOdd++;
}
于 2013-02-27T12:34:04.177 に答える
0
<?php

$hours = array(11,16);
$outputCount = 8;

$now = new DateTime();
$t = clone $now;

$dates = array();
$i=0;

while (count($dates)<$outputCount) {
    $t->setTime($hours[++$i % count($hours)],0,0);
    if ($t>$now) {
        $dates[] = clone $t;
    }
    if ($t->format('G') == max($hours)) {
        $t->modify('+1 day');
    }
}

print_r($dates);
于 2013-02-27T13:06:23.183 に答える