Laravel:如何获取日期范围之间的所有日期和日期范围内的所有日期?

时间:2019-11-16 15:15:28

标签: laravel eloquent date-range php-carbon

我尝试获取 n 日期范围之间的所有日期,以及这些日期范围内的所有日期。

控制器:

public function index()
{
    $startDate = new Carbon('2019-11-20');
    $endDate = new Carbon('2019-11-27');
    $all_dates = array();
    while ($startDate->lte($endDate)) {
        $all_dates[] = $startDate->toDateString();
        $startDate->addDay();
    }
    return $all_dates;
}

我的输出看起来不错。这正是我所需要的:

["2019-11-20","2019-11-21","2019-11-22","2019-11-23","2019-11-24","2019-11-25","2019-11-26","2019-11-27"]

我尝试了多种方式将日期范围从数据库传递到函数。但这不起作用。在我的表格中有两个重要字段:

$query = DB::select('start_date', 'end_date')->get();

1:如何获得与示例相同的结果?

2:如何在输出中忽略每个日期范围的开始日期和结束日期?我只需要一个日期范围内的日期即可。

更新:

所以我找到了解决第一个问题的方法。我的表格当前有两行:

id | start_date | end_date
 1 | 2019-11-22 | 2019-11-24
 2 | 2019-11-26 | 2019-11-28

我通过两个数据库查询(每个字段一个)扩展了我的工作功能,并将它们与循环结合在一起。

public function index()
{
    $query_start_dates = Bookings::select('start_date')->get();
    $start_dates = array();
    $multiple_start_date = json_decode($query_start_dates, true);
    foreach($multiple_start_date as $single_start_date)
    $start_dates[] = implode(', ', $single_start_date);

    $query_end_dates = Bookings::select('end_date')->get();
    $end_dates = array();
    $multiple_end_date = json_decode($query_end_dates, true);
    foreach($multiple_end_date as $single_end_date)
    $end_dates[] = implode(', ', $single_end_date);

    $all_dates = array();

    foreach(array_combine($start_dates, $end_dates) as $f => $n) {
        $startDate = new Carbon($f);
        $endDate = new Carbon($n);
        while ($startDate->lte($endDate)) {
            $all_dates[] = $startDate->toDateString();
            $startDate->addDay();
        }
    }

    return $all_dates;
}

我的新输出:

["2019-11-22","2019-11-23","2019-11-24","2019-11-26","2019-11-27","2019-11-28"]

它看起来并不聪明,但是可以完美运行;)现在,我只需要第二个问题的解决方案即可。

谢谢!

1 个答案:

答案 0 :(得分:1)

您已经解决了第一个问题。我现在正尝试帮助您解决最后一个问题。再次有很多方法可以解决它,简单的方法(虽然不是很聪明,但可以使船漂浮;)):

您可以简单地分割日期数组中的第一个和最后一个元素。通常,您可以使用array shift和pop

#!/usr/bin/env python3
import sys
import numpy as np

fic = sys.argv[1]
data = np.loadtxt(fic)
factors = map(float, sys.argv[2:])
print ('# scale', fic, 'by', list(factors))

for i,f in enumerate(factors):
    data[:,i] *= f

np.savetxt(sys.stdout, data)

您也可以使用array_slice,但我认为shift和pop比slice更好。它表现更好。