Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

参考

年と月から年度を取得する
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
}
yousan
自動化が好きです。CI/CDのCDが好きです。
https://floatingweed.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away