如何在没有DST的情况下从00:00到23:55选择时间列表?

时间:2012-03-28 18:27:54

标签: php unix timestamp dst

我正在尝试创建两个填充相同时间的选择列表。它基本上是为用户选择开始时间和结束时间。我把这些计算为我的时间:

$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 个答案:

答案 0 :(得分:1)

您可以将默认时区设置为UTC(不使用DST):

date_default_timezone_set("UTC");

答案 1 :(得分:1)

为什么不写一个将秒转换为小时/分钟的函数?

function secToTime($seconds = 0) {
    $hours = floor($seconds/3600);
    $minutes = floor($seconds/60)%60;
    return sprintf('%02d:%02d', $hours, $minutes);
}

答案 2 :(得分:1)

通过将$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;
}

另一个建议是使用像this one这样的javascript timepicker(使用jQuery),只是担心在PHP中处理结果。

答案 3 :(得分:1)

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>';
}