PHP如何获取上一个季度的开始和结束日期

时间:2018-10-11 20:39:42

标签: php date

我知道如何获取上一季度的数字,如何将其转换为日期范围,尤其是当它进入上一年时?

$Quarter = floor((date('n') - 1) / 3);

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
)

Sandbox

幸运的是,我是在一个愚人节前写的……这是一种蛮力的方式,但是嘿,行得通。可能有一种“更高级”的方式,但是无论如何...

更新

基于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
)

Sandbox

在这里,多余的括号很重要(大约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)
        );
    }