phpで年度取得

なんか年度末~年度初めになると定期的にこういうプログラム書く機会が増えますよね(笑)

考え方としては「月を求めてみて3月を過ぎていたら今年、そうじゃなきゃ去年度」っていうやつ。

まあまあ厳密にするなら

<?php
/**
 * 年度を求める。
 * 例: echo getEYear(time());
 */
function getEYear($timestamp){
	return intval(date('m', $timestamp)) > 3 ? intval(date('Y', $timestamp)) : intval(date('Y', $timestamp)) - 1;
}
?>

タイムスタンプから年度を求める関数です。全体の中で高頻度に年度を求めるならこういう風な感じで関数化してたほうがいいかなと。

「date(‘m’)」とかせずに、「date(‘m’,$timestamp)」 のようにタイムスタンプをいちいち指定してるのは、処理している間にdate関数が参照する現在のタイムスタンプが変化するかもしれないからです。あと無くても動くけど、精神衛生上intval関数で整数化してます。

シンプルにするなら

出来るだけシンプルに、速度も必要ないしまあ年度の境目には少しずれるかもしれないけどまあいっか、っていう感じで、全体で1か所~数か所しか使わないならこのくらいでいいかも(笑)

<?php
echo date('m') > 3 ? date('Y') : date('Y') - 1;
?>

これだと年度の境目で問題が起こる可能性があるのと、date()関数ってタイムスタンプを指定しない場合、内部でいちいちtime()関数を参照するので遅いっていうデメリットがあります。

でもこの形ならHTMLに埋め込めるしあんまり書かなくていいから簡単といえば簡単ですね。

「-3 month」でもいいかな

こういうのでもいいかも。

<?php
echo date('Y', strtotime('-3 month'));
?>

strtotime()は問題があって直感と違う動作をする場合があって、個人的にはあんまり使いたくないけど、これでも大丈夫だと思います。

検証

検証用にプログラム書いてみた。

<?php
$y = 365 * 24 * 60 * 60;
$stamp = time() - 3 * $y;
while ($stamp < time() + 3 * $y) {
    $d = date('Y年m月d日', $stamp);
    $y1 = intval(date('m', $stamp) > 3 ? date('Y', $stamp) : date('Y', $stamp) - 1);
    $y2 = intval(date('Y', strtotime('-3 month', $stamp)));
    $c = ($y1 === $y2) ? '#080' : '#f00';
    echo "<p style=\"color:$c\">日付: $d 年度(date): $y1 年度(strtotime): $y2 </p>\n";
    $stamp += 24 * 60 * 60;
}
?>

全部緑色でした。たぶん問題ないですね。

追記

ちなみに、strtotimeはいろいろ問題があるのであんまり使わないほうがいいかもしれません。「strtotime バグ」でググるといろいろ出てきます。

カテゴリーPHP

質問・コメントなどあると嬉しいです