循环通过给定的日期

时间:2018-01-24 01:59:27

标签: php loops date

我有一个奇怪的场景,比如我给了四个日期,我需要根据这些日期调用一个方法。首先,我需要将启动时间的函数称为月份的第1个月,将结束时间称为月份的第15个月。再次需要调用此函数作为月份的第16个月的开始时间和月份的第30个/第31个月的结束日期。我可以使用硬编码值调用函数两次,但有没有更好的方法呢?

我正在使用Carbon库来创建PHP并创建像这样的日期

$this->firstDay = Carbon::now()->startOfMonth()->subMonth()>toDateString();

$this->lastDay = Carbon::now()->subMonth()->endOfMonth()>toDateString();

$this->firstHalf   = Carbon::parse($this->firstDay)->addDays(15)->toDateString();

$this->secondStart = Carbon::parse($this->firstDay)->addDays(16)->toDateString();

我需要调用的方法有以下代码

return $this
            ->database
            ->table('table')
            ->selectRaw('SUM(points) AS points, id')
            ->whereBetween('date', [$firstDay, $firstHalf])
            ->groupBy('id')
            ->get();

这些将提供相应的日期,现在我需要将该方法作为firstDay的开始时间和结束时间firstHalf运行,然后再次以secondStart开始时调用结束为lastDay。基本上我要做的是通过两次写入查询来避免重复代码。

如何做到这一点?

1 个答案:

答案 0 :(得分:0)

最好将变量设置为实际的Carbon个实例。

考虑到28或29天的月份,您可以抓住上个月的最后一天并将其除以2以找到中间点。

$lastMonth = Carbon::now()->subMonth();

$start = $lastMonth->startOfMonth();
$end = $lastMonth->endOfMonth();
$middle = floor($end->days / 2);

$firstDay = $start->toDateString();
$firstHalf = $start->addDays($middle)->toDateString();

$lastDay = $end->toDateString();
$secondHalf = $start->addDays($middle + 1)->toDateString();

编辑:更新示例以反映更新后的问题中使用的变量

编辑2: 如果您正在使用Laravel / Eloquent,您甚至可以将实际的Carbon实例直接传递给查询构建器,而无需调用toDateString()