首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DateInterval午夜版

DateInterval午夜版
EN

Stack Overflow用户
提问于 2018-01-19 15:34:52
回答 2查看 294关注 0票数 0

我想用DateInterval生成时隙,当我选择午夜结束时段(00:00)时有问题。

如果我的终点是"23:59“,一切都会产生。

下面是带有输入变量的代码:

代码语言:javascript
运行
复制
$duration = 30; // duration interval<br>
$start    = '22:00'; // start period<br>
$end      = '02:00'; // end period<br>

function generateTimeSlots($duration, $start, $end) {
    $start         = new DateTime($start);
    $end           = new DateTime($end);
    $interval      = new DateInterval("PT" . $duration . "M");
    $periods = array(); 

    for ($intStart = $start; $intStart < $end; $intStart->add($interval)) {
        $endPeriod = clone $intStart;
        $endPeriod->add($interval); 
        if ($endPeriod > $end) {
            $endPeriod = $end;
        }
        $periods[] = $intStart->format('H:i A');
    }

    return $periods;
}


$duration = 30;
$start    = '22:00'; // 10:00 PM
$end      = '02:00'; // 02:00 AM

print_r( generateTimeSlots($duration, $start, $end) );

预期产出:

晚上22:00

晚上22:30

下午23:00

下午23:30

下午00:00

下午00:30

下午01:00

下午01:30

下午02:00

如果我的结束周期超过23:59,则不会生成任何时隙。

有人知道该怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-19 16:05:20

您还需要在$start$end参数中包含有关当天的信息。如果没有提到它们,DateTime将自动选择当前日期,在您的示例中,这意味着您的开始日期是2018-01-19 22:00:00,而您的结束日期是2018-01-19 02:00:00。因为您的结束日期是在您的结束日期之后,所以您的for循环永远不会被迭代。

为了解决这个问题,您可以指定整个日期和时间,或者使用PHP的本机日期识别。我个人倾向于使用完整的日期,因为我发现它通过不必解释人类可读的字符串来使代码更加健壮。

代码语言:javascript
运行
复制
// using complete dates
$startDateTime = new DateTime('2018-01-19 22:00:00');
$endDateTime = new DateTime('2018-01-20 02:00:00');

// using human readable strings    
$startDateTime = new DateTime('today 22pm');
$endDateTime = new DateTime('tomorrow 2am');
票数 0
EN

Stack Overflow用户

发布于 2018-01-19 15:58:11

保持简单,并使用strtotime()函数。这样,您只处理一个整数。然后,在你的观点方面,你可以把它藏回你需要的任何地方。

代码语言:javascript
运行
复制
function generateTimeSlots($duration, $start, $end) {

    $periods = array(); 

    for ($intStart = $start; $intStart <= $end; $intStart += $duration) {
        // $endPeriod = clone $intStart;
        // $endPeriod = $end; 
        // if ($endPeriod > $end) {
        //     $endPeriod = $end;
        // }
        $periods[] = date('H:i A', $intStart);
    }

    return $periods;
}


$duration = 1800; #1800 seconds (30 minutes)
$start    = strtotime('Today 22:00'); // 10:00 PM Today
$end      = strtotime('Tomorrow 02:00'); // 02:00 AM Tomorrow

print_r( generateTimeSlots($duration, $start, $end) );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48344523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档