web-dev-qa-db-ja.com

現在の四半期の日数を取得する簡単な方法は?

PHPは、現在の日付(date( 'j'))と現在の日付(date( 'z'))を取得する方法を提供します。現在の四半期の当日の番号を取得する方法はありますか?

つまり、現在8月5日は、第3四半期の36日目です。

これを計算する標準的な方法がない場合、誰かが(できればPHPベースの)アルゴリズムを便利に持っていますか?

21
Chad Johnson

以下のメソッドでクラスを書きました。楽しい。

public static function getQuarterByMonth($monthNumber) {
  return floor(($monthNumber - 1) / 3) + 1;
}

public static function getQuarterDay($monthNumber, $dayNumber, $yearNumber) {
  $quarterDayNumber = 0;
  $dayCountByMonth = array();

  $startMonthNumber = ((self::getQuarterByMonth($monthNumber) - 1) * 3) + 1;

  // Calculate the number of days in each month.
  for ($i=1; $i<=12; $i++) {
    $dayCountByMonth[$i] = date("t", strtotime($yearNumber . "-" . $i . "-01"));
  }

  for ($i=$startMonthNumber; $i<=$monthNumber-1; $i++) {
    $quarterDayNumber += $dayCountByMonth[$i];
  }

  $quarterDayNumber += $dayNumber;

  return $quarterDayNumber;
}

public static function getCurrentQuarterDay() {
  return self::getQuarterDay(date('n'), date('j'), date('Y'));
}
15
Chad Johnson

どうですか:

$curMonth = date("m", time());
$curQuarter = ceil($curMonth/3);
75
Michiel
function date_quarter()
{
    return ceil(date('n', time()) / 3);
}

または

function date_quarter()
{
    $month = date('n');

    if ($month <= 3) return 1;
    if ($month <= 6) return 2;
    if ($month <= 9) return 3;

    return 4;
}
10
Mike

Carbon を使用できますgetFirstOf {Month、Year、Quarter}()の簡単な修飾子があります

<?php
//take current date
$now = Carbon\Carbon::now();

//modify a copy of it to the first day of the current quarter
$firstOfQuarter = $now->copy()->firstOfQuarter();

//calculate the difference in days and add 1 to correct the index
$dayOfQuarter = $now->diffInDays($firstOfQuarter) + 1;
2
<?php
function day_of_quarter($ts=null) {
    if( is_null($ts) ) $ts=time();
    $d=date('d', $ts);
    $m=date('m', $ts)-1;
    while($m%3!=0) {
        $lastmonth=mktime(0, 0, 0, $m, date("d", $ts),   date("Y",$ts));
        $d += date('t', $lastmonth);
        $m--;
    }
    return $d;
}
echo day_of_quarter(mktime(0, 0, 0, 1, 1,2009));
echo "\n";
echo day_of_quarter(time());
echo "\n";
?>
1
Edward Dale

暦四半期を意味すると(会社の会計年度はその年の任意の月から開始できるため)、日付( 'z')に基づいて年の日付を決定し、次の単純な配列を保持できます。各四半期の開始日:

$quarterStartDays = array( 1 /* Jan 1 */, 90 /* Mar 1, non leap-year */, ... );

次に、現在の年の日付を使用して、最初にその年の日付以下の最大の開始日を特定し、次に減算することができます。

うるう年によって異なる数値が必要になることに注意してください。

1
Jason Cohen

このスレッドは問題を少し超えていることに気付きました。これは、「Quarter」と「PHP」を含む多くのGoogle検索に対する最初の応答です。

組織のISO標準を使用している場合、ビジネスアプリを実行している場合は、

$curMonth = date("m", time());
$curQuarter = ceil($curMonth/3);

ISO規格の年の最初の日は12月30日または31日になる可能性があるため、不正解です。

代わりに、これを使用する必要があります:

  $current_yearly_cycle_year_number = 2019;
  $current_yearly_cycle_start->setISODate( $current_yearly_cycle_year_number, 1, 1 );
  $current_yearly_cycle_end->setISODate( $current_yearly_cycle_year_number, 53, 1 );

  if( $current_yearly_cycle_end->format("W") !== "53" )
    $current_yearly_cycle_end->setISODate( $current_yearly_cycle_year_number, 52, 1 );

  $week_number_start = intval( $current_yearly_cycle_start->format( "W" ) );
  $timestamp_start_quarter = ( $week_number_start === 1 ? 1 : intval( ceil( $current_yearly_cycle_start->format( "m" ) / 3 ) ) );

  var_dump( $timestamp_start_quarter );
0
Robert
<?php

function quarter_day($time = "") {

    $time = $time ? strtotime($time) : time();
    $date = intval(date("j", $time));
    $month = intval(date("n", $time));
    $year = intval(date("Y", $time));

    // get selected quarter as number between 1 and 4
    $quarter = ceil($month / 3);

    // get first month of current quarter as number between 1 and 12
    $fmonth = $quarter + (($quarter - 1) * 2);

    // map days in a year by month
    $map = [31,28,31,30,31,30,31,31,30,31,30,31];

    // check if year is leap
    if (((($year % 4) == 0) && ((($year % 100) != 0) || (($year % 400) == 0)))) $map[1] = 29;

    // get total number of days in selected quarter, by summing the relative portion of $map array
    $total = array_sum(array_slice($map, ($fmonth - 1), 3));

    // get number of days passed in selected quarter, by summing the relative portion of $map array
    $map[$month-1] = $date;
    $day = array_sum(array_slice($map, ($fmonth - 1), ($month - $fmonth + 1)));

    return "Day $day on $total of quarter $quarter, $year.";

}

print(quarter_day("2017-01-01")) . "\n"; // prints Day 1 on 90 of quarter 1, 2017.
print(quarter_day("2017-04-01")) . "\n"; // prints Day 1 on 91 of quarter 2, 2017.
print(quarter_day("2017-08-15")) . "\n"; // prints Day 46 on 92 of quarter 3, 2017.
print(quarter_day("2017-12-31")) . "\n"; // prints Day 92 on 92 of quarter 4, 2017.
0
Simo P. M.

最初に第1四半期の日付を計算する必要があります

$current_month = date('m');

// Get first month of quarter
$new_month = (3 * floor(($current_month - 1 ) / 3)) + 1;

// Add prefix zero if needed
$new_month = substr('0' . $new_month, -2);

$first_quarter_day_date = date('Y') . '-' . $new_month . '-01';

次に http://php.net/manual/en/datetime.diff.php を計算します

$datetime1 = new DateTime($first_quarter_day_date);
$datetime2 = new DateTime();

$interval = $datetime1->diff($datetime2);
echo $interval->format('%a days');
0
Clemens Tolboom