给你:
function getQuarter(\DateTime $DateTime) {
$y = $DateTime->format('Y');
$m = $DateTime->format('m');
switch($m) {
case $m >= 1 && $m <= 3:
$start = '01/01/'.$y;
$end = (new DateTime('03/1/'.$y))->modify('Last day of this month')->format('m/d/Y');
$title = 'Q1 '.$y;
break;
case $m >= 4 && $m <= 6:
$start = '04/01/'.$y;
$end = (new DateTime('06/1/'.$y))->modify('Last day of this month')->format('m/d/Y');
$title = 'Q2 '.$y;
break;
case $m >= 7 && $m <= 9:
$start = '07/01/'.$y;
$end = (new DateTime('09/1/'.$y))->modify('Last day of this month')->format('m/d/Y');
$title = 'Q3 '.$y;
break;
case $m >= 10 && $m <= 12:
$start = '10/01/'.$y;
$end = (new DateTime('12/1/'.$y))->modify('Last day of this month')->format('m/d/Y');
$title = 'Q4 '.$y;
break;
}
return array(
'start' => $start,
'end' => $end,
'title'=>$title,
'start_nix' => strtotime($start),
'end_nix' => strtotime($end)
);
}
print_r(getQuarter(new DateTime()));
输出
Array
(
[start] => 10/01/2018
[end] => 12/31/2018
[title] => Q4 2018
[start_nix] => 1538377200
[end_nix] => 1546243200
)
Sandbox
你很幸运,我很久以前就写了这个......这是一种蛮力的做法,但它确实有效。可能有一种“更高级”的方式,但无论如何......
更新
基于一些使用DateTime的cmets,除了让函数中的代码更简洁之外,还有很多优点。例如获取上一季度:
print_r(getQuarter((new DateTime())->modify('-3 Months'));
输出
Array
(
[start] => 07/01/2018
[end] => 09/30/2018
[title] => Q3 2018
[start_nix] => 1530428400
[end_nix] => 1538290800
)
Sandbox
这里多余的括号很重要(new DateTime 附近)
(new DateTime())->modify('-3 Months');
这会导致构造函数返回对象的实例,这样您就可以立即对其调用 modify。相当于这样做:
$DateTime = new DateTime();
$DateTime->modify('-3 Months');
但没有创建局部变量。
同样的道理,你可以通过做得到下一个季度
print_r(getQuarter((new DateTime())->modify('+3 Months'));
另一个例子是函数本身(特别是):
(new DateTime('03/1/'.$y))->modify('Last day of this month')
它的作用是获取 DateTime 对象所具有的任何月份的最后一天,在本例中为 3。所以我们甚至不必考虑那个月有多少天,它只返回正确的数字。这些是Relative Date formats
http://php.net/manual/en/datetime.formats.relative.php
最后一个可能对您有用的是first day of ? this year,其中? 是月份名称。例如:
print_r(getQuarter((new DateTime())->modify('first day of january this year')));
print_r(getQuarter((new DateTime())->modify('first day of april this year')));
print_r(getQuarter((new DateTime())->modify('first day of july this year')));
print_r(getQuarter((new DateTime())->modify('first day of october this year')));
实际上,这将为您提供今年每个季度的数据。
希望对您有所帮助。