LoginSignup
6
10

More than 5 years have passed since last update.

PHPでDateTimeを使って年度を取得

Last updated at Posted at 2016-04-01

会計年度を取得する関数を作ってみた。

参考

年と月から年度を取得する
http://qiita.com/kidatti/items/e9ecfb76924d432994c0

[#php]年度を取得する関数
http://qiita.com/sshojiro/items/23aa3abc821c2b8c1de4

コード

@smzk さんに指摘をもらって閏年の判定がうまく行かない件を直しました。Thanks!

<?php
main();

/**
 * (会計)年度を取得する
 * ex.)
 * 2016-04-01 => 2016
 * 2016-12-31 => 2016
 * 2017-01-01 => 2016
 * 2017-03-31 => 2016
 * 2017-04-01 => 2017
 *
 * @param DateTime $theDate 判定したい日時
 * @param string $startDay 年度開始日(変更する場合に指定)
 *
 * @return int 年度
 */
function getFiscalYear(DateTime $theDate, $startDay='04-01') {
    /**
     * 年度開始日との差分を取得
     * ex.) 2016年04月01日 -(引く) 2016年04月01日(年度開始日) = 差分0日 (invert = 0
     * ex.) 2016年01月01日 -(引く) 2016年04月01日(年度開始日) = マイナス3ヶ月 (invert = 1
     */
    $diff = (new DateTime($theDate->format('Y') . '-' . $startDay))->diff($theDate);
    if ( $diff->invert ) { // 引き算の結果がマイナスだった場合には早生まれ状態
        return intval($theDate->format('Y')) - 1;
    } else { // そのまま
        return intval($theDate->format('Y'));
    }
}

function main() {
    $date = new DateTime('2016-05-02');
    $fiscalYear = getFiscalYear($date);
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2016

    $date = new DateTime('2016-04-01');
    $fiscalYear = getFiscalYear($date);
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2016

    $date = new DateTime('2016-03-31');
    $fiscalYear = getFiscalYear($date);
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2015

    $date = new DateTime('2016-01-01');
    $fiscalYear = getFiscalYear($date);
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2015

    $date = new DateTime('2016-08-01');
    $fiscalYear = getFiscalYear($date, '09-01'); // 年度開始日指定
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2015

    $date = new DateTime('2016-09-01');
    $fiscalYear = getFiscalYear($date, '09-01'); // 年度開始日指定
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2016

    $date = new DateTime('2016-02-28');
    $fiscalYear = getFiscalYear($date, '03-01'); // 年度開始日指定
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2015

    $date = new DateTime('2016-02-29');
    $fiscalYear = getFiscalYear($date, '03-01'); // 年度開始日指定
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2015

    $date = new DateTime('2016-03-01');
    $fiscalYear = getFiscalYear($date, '03-01'); // 年度開始日指定
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2016

    $date = new DateTime('2017-02-28');
    $fiscalYear = getFiscalYear($date, '03-01'); // 年度開始日指定
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2016

    $date = new DateTime('2017-02-29'); // DateTimeの仕様で03-01扱い
    $fiscalYear = getFiscalYear($date, '03-01'); // 年度開始日指定
    var_dump($date->format('Y-m-d'), $fiscalYear); // 2017
}
6
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10