【问题标题】:Create array of start and end datetimes from two datetime variables从两个日期时间变量创建开始和结束日期时间数组
【发布时间】:2017-09-25 07:14:56
【问题描述】:

我有一个开始和结束的 DateTime 对象,并希望遍历它们以获得每天的开始和结束数组。为了迭代它,我编写了这个函数:

public function getDatesBetweenTwoDates($start = null, $end = null)
{
    return iterator_to_array(new \DatePeriod($start, new \DateInterval('P1D'), $end));
}

但是,这个函数返回一个这样的数组并且不支持时间:

['2017-10-01', '2017-10-02', ...]

我需要的是这样的:

输入:

$start = new DateTime("2017-10-01 10:00:00");
$end = new DateTime("2017-10-03 19:00:00");

输出:

[
    [
        'start' => '2017-10-01 10:00:00',
        'end' => '2017-10-01 23:59:59'
    ],
    [
        'start' => '2017-10-02 00:00:00',
        'end' => '2017-10-02 23:59:59'
    ],
    [
        'start' => '2017-10-03 00:00:00',
        'end' => '2017-10-03 19:00:00'
    ],
]

任何提示或帮助将不胜感激。

【问题讨论】:

    标签: php arrays datetime


    【解决方案1】:

    我发现您需要遍历数组并使用新格式重新创建日期数组

    $start = new DateTime("2017-10-01 10:00:00");
    $end = new DateTime("2017-10-03 19:00:00");
    
    $datesArray = iterator_to_array(new \DatePeriod($start, new \DateInterval('P1D'), $end));
    
    array_walk($datesArray, function ($value, $key) use (&$dates, $start, $end) {
    
        $dates[$key]['start'] = (
            ($key == 0) ? $value->format('Y-m-d H:i:s') : $value->setTime(00, 0, 00)->format('Y-m-d H:i:s')
        );
    
        $endDate = $value->setTime(23, 59, 59);
    
        if ($endDate->getTimestamp() > $end->getTimestamp()) {
            $endDate = $end;
        }
    
        $dates[$key]['end'] = $endDate->format('Y-m-d H:i:s');
    
    
    });
    print_r($dates);
    

    这将输出:

    Array
    (
        [0] => Array
            (
                [start] => 2017-10-01 10:00:00
                [end] => 2017-10-01 23:59:59
            )
    
        [1] => Array
            (
                [start] => 2017-10-02 00:00:00
                [end] => 2017-10-02 23:59:59
            )
    
        [2] => Array
            (
                [start] => 2017-10-03 00:00:00
                [end] => 2017-10-03 19:00:00
            )
    
    )
    

    现场样本:https://3v4l.org/UnDcA

    注意:正如您在 3v4l 中看到的,如果您使用 HHVM,您将得到不同/错误的输出。

    【讨论】:

    • 非常感谢,这正是我想要的!
    【解决方案2】:

    这应该可行:

    <?php
     $start = "start_date";
     $end = "end_date";
     $date = array("start"=>$start, "end"=>$end);
     $dates = array();
     array_push($dates, $date);
     print_r($dates);
    ?>
    

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      相关资源
      最近更新 更多