Я создаю отчет для клиента, использующего php и codeigniter.
Этот отчет является финансовым отчетом, поэтому я должен отражать деньги, собранные с начала финансового года. В этом случае 31 июля.
Я уже запрашиваю у пользователя дату отчета, но как мне получить php, чтобы узнать, какой финансовый год взять?
У меня есть приблизительная идея, что-то вроде
«Если Месяц-День до 31 июля, используйте текущий год-1« Использовать в текущем году »,
Но я не знаю, как я буду это кодировать, или если это сработает, или если есть более элегантный способ сделать то же самое.
Я думаю, ваш лучший выбор – это класс dateTime.
http://us3.php.net/manual/en/class.datetime.php
Я думаю, что что-то вроде того, что вам понадобится
public function getCurrentYear(DateTime $dateToCheck) { $today = new DateTime(); $currentYear = (int)$today->format('Y'); $endFiscalYear = new DateTime('31 July'); //year left out, so will default to this year if($dateToCheck < $endFiscalYear){ //you need PHP >= 5.2.2 for this to work $currentYear--; } return $currentYear; }
Вы можете установить $ сегодня, делая что-то вроде: –
$today = new DateTime('20 June 2011');
Подробнее читайте в ссылке выше
Вот немного другая версия, которая должна быть немного более надежной, поскольку она вернет финансовый год любой даты, которую вы даете, а не только даты в текущем году.
function getFiscalYear(DateTime $dateToCheck) { $fiscalYearEnd = '31 July'; $year = (int)$dateToCheck->format('Y'); $fiscalyearEndDate = new DateTime($fiscalYearEnd . ' ' . $year); if($dateToCheck <= $fiscalyearEndDate){ $year--; } return $year; }
используйте его вот так: –
$dateToCheck = new DateTime('1 jan 2009'); // for example $fiscalYear = getFiscalYear($dateToCheck);
Это вернет 2008 год
Эта версия должна работать, если ваша версия PHP <5.2
function getFiscalYear($timestamp) { $year = (int)date('Y', $timestamp); $fiscalYearEndDate = strtotime('31 July ' . $year); if($timestamp < $fiscalYearEndDate) $year--; return $year; }
Используйте вот так:
$date = strtotime('1 Jan 2009'); fiscalYear = getFiscalYear($date);
Вернется 2008
function get_fiscal_year($format = 'Ym-d', $cutoff_date = '31 July') { $fiscal_year = strtotime($cutoff_date); if(time() < $fiscal_year) $fiscal_year = strtotime($cutoff_date .' last year'); return date($format, $fiscal_year); } $fisical_year = get_fiscal_year(); $now = date('Ym-d');
Затем вы можете использовать эту функцию для запроса базы данных с условием оператора
transcation_date between $fisical_year and $now
Если пользователь задает дату: @givenDate
и вы хотите выполнить поиск в вашем dateField
(который имеет date
типа), вы можете использовать что-то вроде:
WHERE dateField BETWEEN DATE( CONCAT( YEAR(@givenDate)-(MONTH(@givenDate)<8), '-08-01' )) AND DATE( CONCAT( 1+YEAR(@givenDate)-(MONTH(@givenDate)<8), '-07-31' ))