我知道如何获取上一季度的数字,如何将其转换为日期范围,尤其是当它进入上一年时?
$Quarter = floor((date('n') - 1) / 3);
答案 0 :(得分:0)
您在这里:
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
)
幸运的是,我是在一个愚人节前写的……这是一种蛮力的方式,但是嘿,行得通。可能有一种“更高级”的方式,但是无论如何...
更新
基于DateTime
的一些注释除了使函数中的代码更简洁外,还具有许多优点。例如,获取上一个季度:
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
)
在这里,多余的括号很重要(大约new DateTime
)
(new DateTime())->modify('-3 Months');
这将导致构造函数返回该对象的实例,使您可以立即对其进行调用。等效于执行此操作:
$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')));
有效地,这将给您今年的每个季度。
希望有帮助。
答案 1 :(得分:0)
每个开始日期和结束日期的简单单行代码是:
$start = (new DateTime('first day of -' . ((date('n') % 3) + 2) . ' month midnight'))->format('m/d/Y');
$end = (new DateTime('last day of -' . (date('n') % 3) . ' month midnight'))->format('m/d/Y');
DateTime
可以与relative values一起使用,因此您可以描述您想要的日期。
答案 2 :(得分:-1)
查找上一季度的开始和结束日期
function getpreviousQuarterData(\DateTime $DateTime) {
$y = $DateTime->format('Y');
$m = $DateTime->format('m');
switch($m) {
case $m >= 1 && $m <= 3:
$start = '10/01/'.$y-1;
$end = (new DateTime('12/1/'.$y-1))->modify('Last day of this month')->format('m/d/'.$y-1);
$title = 'Q4 '.$y-1;
break;
case $m >= 4 && $m <= 6:
$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 >= 7 && $m <= 9:
$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 >= 10 && $m <= 12:
$start = '07/01/'.$y;
$end = (new DateTime('09/1/'.$y))->modify('Last day of this month')->format('m/d/Y');
$title = 'Q3 '.$y;
break;
}
return array(
'start' => $start,
'end' => $end,
'title'=>$title,
'start_nix' => strtotime($start),
'end_nix' => strtotime($end)
);
}