Как мне составить список времени с 00:00 до 23:55 без DST? - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь создать два списка выбора, заполненных одинаковым временем. Это в основном для пользователя, чтобы выбрать время начала и время окончания. Я рассчитал их как мои времена:

$startTime = 0; //00:00
$endTime =  86100; //23:55'
$now = $startTime;

и затем я увеличиваю это так:

$now += 300; 

, где 300 = 5 минут, поэтому я увеличиваю время на 5 минут в каждом цикле.

Поэтому мои списки выбора должны выглядеть так:

00:00
00:05
00:10
...
...
23:45
23:50
23:55

Все это работает, за исключением фактического печатного времени. Я получаю это:

1:00
1:05
...
...
00:45
00:50
00:55

Я подозреваю, что проблема в том, что мы сейчас находимся в Великобритании на летнем времени. Как я должен поэтому решить эту проблему?

Это мой настоящий метод:

public function timeSelectList()
{

    $startTime = 0; //00:00
    $endTime =  86100; //23:55'
    $now = $startTime;

    $startSelectList = '<label for="startSelect">Start Time</label><select name="startSelect" id="startSelect">';
    $endSelectList = '<label for="endSelect">End Time</label><select name="endSelect" id="endSelect">';

    while($now <= $endTime)
    {
        if($now == 61200)//17:00
        {
            $startSelectList .= '<option value="'.$now.'" selected="selected">'.date('H:i', $now).'</option>';
            $endSelectList .= '<option value="'.$now.'">'.date('H:i', $now).'</option>';
        }
        else if($now == 64800)//18:00
        {
            $startSelectList .= '<option value="'.$now.'">'.date('H:i', $now).'</option>';
            $endSelectList .= '<option value="'.$now.'" selected="selected">'.date('H:i', $now).'</option>';
        }
        else
        {
            $startSelectList .= '<option value="'.$now.'">'.date('H:i', $now).'</option>';
            $endSelectList .= '<option value="'.$now.'">'.date('H:i', $now).'</option>';
        }
        $now += 300; //increment 5 minutes (300 seconds = 5 minutes
    }

    $startSelectList .= '</select>';
    $endSelectList .= '</select>';

    return $startSelectList.$endSelectList;
}

Ответы [ 4 ]

1 голос
/ 28 марта 2012
function timeSelectList()
{

    $startTime = 0;
    $endTime =  86400;
    $now = $startTime;

    while($now < $endTime)
    {
        $h = floor($now / 3600);
        $m =  ($now - ($h * 3600)) / 60;
        $x .= '<option value="'.$now.'">'.sprintf('%02d:%02d', $h, $m).'</option>';
        $now += 300;
    }

    return 
    '<label for="startSelect">Start Time</label><select name="startSelect" id="startSelect">'.$x.'</select>
    <label for="endSelect">End Time</label><select name="endSelect" id="endSelect">'.$x.'</select>';
}
1 голос
/ 28 марта 2012

Почему бы просто не написать функцию, которая будет конвертировать секунды в часы / минуты?

function secToTime($seconds = 0) {
    $hours = floor($seconds/3600);
    $minutes = floor($seconds/60)%60;
    return sprintf('%02d:%02d', $hours, $minutes);
}
1 голос
/ 28 марта 2012

Устанавливая $now в 0 и затем используя его в date('H:i', $now), вы просите PHP сообщить вам, сколько часов и минут было в вашем текущем часовом поясе, когда Unix time началось. Вот почему решение @ TheOx должно работать.

Я бы порекомендовал либо использовать что-то вроде предложенного @Crashspeeder, либо, если вам действительно нужно время конкретной даты, примерно так:

$now = strtotime('midnight today'); //or whatever date you need
$endTime = strtotime('midnight tomorrow'); 

while($now < $endtime){
    //your code here
    $now += 300;
}

Еще одно предложение - использовать javascript timepicker, например , этот (использует jQuery) и просто беспокоиться об обработке результата в PHP.

1 голос
/ 28 марта 2012

Вы можете установить часовой пояс по умолчанию на UTC (который не использует DST):

date_default_timezone_set("UTC");
...