I am trying to set a start date and end date by the quarter.
For example, I am working on a reporting system where i need to report data for quarter 1, quarter 2, qu
I glimpsed over answers and all are about quarters of this year. Sometimes, you need quarter for particular date. Here is my attempt with detailed explanation what-does-what in code comments:
/** * get quarter begin/end date * * possible usage: * quarter start date: quarter('2016-04-12')[start] - result: 2016-04-01 * quarter end date: quarter('2016-04-12')[end] - result: 2016-06-30 * quarter number: quarter('2016-04-12')[number] - result: 2 * * @param string $time date you want quarter begin and end for - accepted formats, at least: 'Y-m', but also: 'Y-m-d', 'Y-m-d H:i:s' etc. * @return array [quarter start, quarter end, quarter number] */ public function quarter($time) { /** * get quarter number for given date * we are ceiling floating point value, so I use (int) casting to get just integer (without decimal part) * round() could be used instead of casting to (int) */ $quarter = (int)ceil(date("m", strtotime($time)) / 3); $year = date("Y", strtotime($time)); $quarters = [ 1 => ['01-01', '03-31', 1], 2 => ['04-01', '06-30', 2], 3 => ['07-01', '09-30', 3], 4 => ['10-01', '12-31', 4], ]; $quarterStart = $year . '-' . $quarters[$quarter][0]; $quarterEnd = $year . '-' . $quarters[$quarter][1]; $quarterNumber = $quarters[$quarter][2]; return ['start' => $quarterStart, 'end' => $quarterEnd, 'number' => $quarterNumber]; }