[英]How to get timestamp of: current year quarter start/end, last quarter start/end, from specified date in 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.