簡體   English   中英

PHP 如何獲取上一季度的開始和結束日期

[英]PHP how do I get previous Quarter start and end date

我知道如何獲取上一季度的數字,如何將其轉換為日期范圍,尤其是當它進入上一年時?

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

干得好:

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

實際上,這將為您提供今年的每個季度。

希望有幫助。

每個開始和結束日期的簡單單行是:

$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可以使用相對值,因此您可以描述您想要的日期。

我正在使用此代碼。 它使用 DateTime object 及其方法。 主要方法是getCurrentQuarterStartDate(),其他2個方法使用它。 您不僅可以獲得上一季度的日期,還可以獲得過去和未來任何其他季度的日期。

<?php

echo "Current quarter start: \n";
$dt = getCurrentQuarterStartDate();
var_dump($dt->format('Y-m-d'));

echo "Current quarter end: \n";
$dt = getRelativeQuarterEndDate(0);
var_dump($dt->format('Y-m-d'));

echo "Next quarter start: \n";
$dt = getRelativeQuarterStartDate(1);
var_dump($dt->format('Y-m-d'));

echo "Next quarter end: \n";
$dt = getRelativeQuarterEndDate(1);
var_dump($dt->format('Y-m-d'));


echo "Prev quarter start: \n";
$dt = getRelativeQuarterStartDate(-1);
var_dump($dt->format('Y-m-d'));

echo "Prev quarter end: \n";
$dt = getRelativeQuarterEndDate(-1);
var_dump($dt->format('Y-m-d'));

  function getCurrentQuarterStartDate()
  {
    $dt = new DateTime('now', new DateTimeZone('Europe/Prague'));
    $currentMonth = (int)$dt->format('m');
    $currentYear = (int)$dt->format('Y');
    $currentQuartalNr = ceil($currentMonth / 3); // returns 0.333-4 and it is ceiled to 1-4
    $currentQuartalStartMonth = $currentQuartalNr * 3 - 2; // returns 1,4,7 or 10
    $dt->setDate($currentYear, $currentQuartalStartMonth, 1);
    return $dt;
  }

  /**
   * @param $offset 0 = current quarter, 1 = next, -1 = prev, -2, +5 ...
   */
  function getRelativeQuarterStartDate($offset = 0)
  {
    $currentQStartDate = getCurrentQuarterStartDate();

    if ($offset == 0) {
      return $currentQStartDate;
    }

    if ($offset > 0) {
      $currentQStartDate->add(new \DateInterval('P' . $offset*3 . 'M'));
      return $currentQStartDate;
    }

    if ($offset < 0) {
      $currentQStartDate->sub(new \DateInterval('P' . abs($offset)*3 . 'M'));
      return $currentQStartDate;
    }

  }

  /**
   * @param $offset 0 = current quarter, 1 = next, -1 = prev, -2, +5 ...
   */
  function getRelativeQuarterEndDate($offset = 0)
  {
    $dt = getCurrentQuarterStartDate();

    if ($offset >= 0) {
      $dt->add(new \DateInterval('P' . $offset*3 . 'M'));
    }

    if ($offset < 0) {
      $dt->sub(new \DateInterval('P' . abs($offset)*3 . 'M'));
    }

    $dt->add(new \DateInterval('P3M'));
    $dt->sub(new \DateInterval('P1D'));
    return $dt;
  }

查找上一季度的開始和結束日期

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM