【问题标题】:PHP how do I get previous Quarter start and end datePHP如何获取上一季度的开始和结束日期
【发布时间】:2018-10-11 20:39:41
【问题描述】:

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

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

【问题讨论】:

  • 如果今天是 2018 年 10 月 12 日,您预计的日期范围是多少?
  • 请不要破坏您的帖子。通过在 Stack Exchange 网络上发布,您已授予 SE 分发该内容的不可撤销的权利(在 CC BY-SA 3.0 license 下)。根据 SE 政策,任何破坏行为都将被撤销。

标签: php date


【解决方案1】:

给你:

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')));

实际上,这将为您提供今年每个季度的数据。

希望对您有所帮助。

【讨论】:

  • 是的,我创建了一组按钮来填充搜索的日期范围。例如,我有每个季度和当年以及当年月份的按钮。我稍微修改了一下,所以它只返回当前季度。
  • 它在寻找什么类型的输入?我试过喂它什么都不会抛出 error_log 消息,但似乎返回信息传递给 getQuarter() 的参数 1 必须是 DateTime 的实例,给定的字符串,称为
  • 它在答案中,特别是getQuarter(new DateTime()) 它是 PHP 的 DateTime 类的一个实例。 php.net/manual/en/class.datetime.php
  • 例如,如果您希望二月的季度在getQuarter(new DateTime('2018-1-1')) 中,我使用日期时间,因为在处理各种日期格式时更容易区分月份和年份。例如getQuarter(new DateTime('1/1/2018')) 同上。
  • 我得到它是为了给我当前季度的信息,但我需要上一季度。
【解决方案2】:

每个开始和结束日期的简单单行是:

$start = (new DateTime('first day of -' . (((date('n') - 1) % 3) + 3) . ' month'))->format('Y-m-d'); # first day of previous quarter
$end = (new DateTime('last day of -' . (((date('n') - 1) % 3) + 1) . ' month'))->format('Y-m-d'); # last day of previous quarter

DateTime 可以与relative values 一起使用,因此您可以描述您想要的日期。

【讨论】:

  • 代码是当前季度,问题是上一季度!
  • @LoveKumar 你错了,代码在特定日期(即 2020-09-01)有一个小错误,已经更正,但它打算计算上一季度。
【解决方案3】:

查找上一季度的开始和结束日期

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)
        );
    }

【讨论】:

    猜你喜欢
    • 2014-02-06
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多