首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DateInterval和DatePeriod生成轮班数组

使用DateInterval和DatePeriod生成轮班数组
EN

Stack Overflow用户
提问于 2014-07-02 16:09:24
回答 2查看 3.4K关注 0票数 1

我正在使用DateInterval和DatePeriod来生成医学应用程序中的转换

代码语言:javascript
复制
$begin = new DateTime('2012-08-01 08:00');
$end = new DateTime('2012-08-01 12:00');
$interval = new DateInterval('PT45M');
$daterange = new DatePeriod($begin, $interval ,$end);

这些函数允许我生成以下数组

代码语言:javascript
复制
Array
(
    [0] => 08:00
    [1] => 08:45
    [2] => 09:30
    [3] => 10:15
    [4] => 11:00
    [5] => 11:45
)

哪些函数,以及我如何做到这一点,最终的数组就像这样完成并分块了?

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [0] => 08:00
            [1] => 08:45
        )

    [1] => Array
        (
            [0] => 08:45
            [1] => 09:30
        )

    [2] => Array
        (
            [0] => 09:30
            [1] => 10:15
        )

    [3] => Array
        (
            [0] => 10:15
            [1] => 11:00
        )

    [4] => Array
        (
            [0] => 11:00
            [1] => 11:45
        )
)

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-02 16:14:16

代码语言:javascript
复制
$previous = null;
$dates    = array();
foreach ($period as $dt) {
    $current = $dt->format("H:i");
    if (!empty($previous)) {
        $show = new DateTime($current);
        $dates[] = array($previous, $show->format('H:i'));
    }
    $previous = $current;
}
票数 2
EN

Stack Overflow用户

发布于 2014-07-02 17:25:17

在使用DateTime函数检索数组之后。只要插上密码就行了。:)

代码语言:javascript
复制
$retrieveArray = array('08:00','08:45','09:30','10:15','11:00','11:45'); // Sample Array, Assumed mentioned in Question.

$final = array();
for ($i=0; $i < count($retrieveArray)-1; $i++) { 
    $j = $i+1;
    $final[$i] = array($retrieveArray[$i], $retrieveArray[$j]);
}

使用var_dump($final);检查数组结果。

期望输出

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [0] => 08:00
            [1] => 08:45
        )

    [1] => Array
        (
            [0] => 08:45
            [1] => 09:30
        )

    [2] => Array
        (
            [0] => 09:30
            [1] => 10:15
        )

    [3] => Array
        (
            [0] => 10:15
            [1] => 11:00
        )

    [4] => Array
        (
            [0] => 11:00
            [1] => 11:45
        )

)

编辑:

添加最后一班

@jhon是对的。如果与区间长度完全匹配,则跳过最后一个边值。根据您的需要,我建议将+1 min添加到您的结束时间。这是一个调整/修复,但服务的目的。

代码语言:javascript
复制
$begin = new DateTime('2012-08-01 08:00');
$end = new DateTime('2012-08-01 10:00');
$end = $end->modify( '+1 minute' ); // Tweak, to add last shift value.
$interval = new DateInterval('PT30M');
$daterange = new DatePeriod($begin, $interval ,$end);

检查输出

代码语言:javascript
复制
foreach ( $daterange as $dt ){
    echo '<pre>';
    echo $dt->format( "H:i" );
    echo '</pre>';
}

如果它与区间的长度完全匹配,它就是包含最后的边值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24536037

复制
相关文章

相似问题

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