Простой способ узнать номер дня текущего квартала?

PHP предоставляет способы получить номер текущего дня месяца (date ('j')), а также номер текущего дня в году (date ('z')). Есть ли способ узнать номер текущего дня текущего квартала?

Итак, прямо сейчас, 5 августа, это 36-й день третьей четверти.

Если нет стандартного способа расчета этого, есть ли у кого-нибудь удобный алгоритм (предпочтительно на основе PHP)?


person Chad Johnson    schedule 05.08.2009    source источник
comment
Как вы определяете квартал?   -  person lc.    schedule 05.08.2009
comment
Группа трех месяцев.   -  person Chad Johnson    schedule 05.08.2009
comment
Псевдокод: day_of_quarter (y, m, d) = day_of_year (y, m, d) - day_of_year (y, 3 * ((m-1)% 3) + 1, 1) + 1   -  person balpha    schedule 05.08.2009
comment
(при условии, что все значения основаны на 1)   -  person balpha    schedule 05.08.2009


Ответы (8)


Как насчет:

$curMonth = date("m", time());
$curQuarter = ceil($curMonth/3);
person Michiel    schedule 24.02.2011
comment
Я действительно не могу понять, почему этот ответ получил так много голосов, поскольку он вообще не отвечает на вопрос - он просто находит четверть, которая не была вопросом - person Beauvais; 20.12.2014
comment
Он набирает голоса, потому что люди приходят сюда в поисках математической формулы, чтобы узнать квартал. - person LucasSeveryn; 03.12.2015
comment
Для тех, кто ищет квартал с нулевой индексацией: просто используйте floor вместо ceil. (проверено) - person Michal - wereda-net; 18.02.2019

Я написал класс со следующими методами. Наслаждаться.

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'));
}
person Chad Johnson    schedule 05.08.2009

Вы можете использовать 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;
person Eelke van den Bos    schedule 19.02.2017

Предполагая, что вы имеете в виду календарный квартал (поскольку финансовый год компании может начинаться в любом месяце года), вы можете полагаться на дату ('z') для определения дня года, а затем сохранить простой массив день начала каждого квартала:

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

Затем, используя текущий день года, вы можете сначала найти самый большой начальный день, который меньше или равен дню года, а затем вычесть.

Обратите внимание, что вам нужны разные числа в зависимости от високосного года.

person Jason Cohen    schedule 05.08.2009

Нам нужно рассчитать дату первого квартала первого

$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');
person Clemens Tolboom    schedule 23.06.2017

Я заметил, что эта ветка выходит за рамки вопроса, и это первый ответ на многие поисковые запросы в Google, в которых есть «Квартал» и «PHP».

Если вы работаете со стандартами организации ISO, что вам следует делать, если вы делаете бизнес-приложение, тогда

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

НЕ правильно, потому что первым днем ​​года в стандартах ISO может быть 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 );
person Robert    schedule 30.12.2019

person    schedule
comment
прошло 5 лет и все, но .. это возвращает квартал, а не день в квартале - person pcarvalho; 20.09.2018

person    schedule
comment
Вы должны предоставить некоторые примеры ввода и вывода, а также объяснение вашего кода, а не просто сбрасывать необработанный исходный код. - person Arya McCarthy; 21.04.2017
comment
Спасибо, код в значительной степени объясняет себя, но, пожалуйста. - person Simo P. M.; 21.04.2017