• PHP
  •  

PHPで〇〇歴何年を実装する

コンテンツ

はじめに

最近は専らPythonを書く機会が多く、個人的にPHPは第2言語の位置づけになっていましたが、PHPで〇〇歴何年を実装する機会があったので、調べた内容を記載します。

環境

  • PHP 7.4.21

結論

完成形のコードは以下のようになります。

<? php
function reki($start) {
    $start = new DateTime($start);
    $now = new DateTime('now');
    $interval = $start->diff($now);
    echo ($interval->days < 365 ? $interval->format('%mヶ月') : $interval->format('%y年%mヶ月'));
}
?>

実行結果は以下のようになります。

php > reki('2000-01-01');
21年6ヶ月
php > reki('2021-01-01');
6ヶ月

解説

今回は歴を計算するため日付を扱うので、DateTimeクラスを使うことにします。

(DateTimeクラスはPHP5.2.0以上であれば利用可能です)

処理フロー

歴を返す関数を作成します。引数は歴の初めの日です。

function reki($start)

引数で得られる歴の初めの日を$start、今日の日付を$nowに代入します。
また、DateTime('now')とすることで、現在の日時を取得できます。

$start = new DateTime($start);
$now = new DateTime('now');

そして、これら2つの日付の差をdiffメソッドによって求めます。

(DateTime::diffメソッドはPHP5.3.0以上であれば利用可能です)

diffメソッドで得られた値はDateInterval型になっています。

Dateintervalクラスは、年月日の情報を$y$m$dのようなプロパティとして持っており、Publicで宣言されているためそのまま外から値にアクセスが可能になります。

echo ($interval->days < 365 ? $interval->format('%mヶ月') : $interval->format('%y年%mヶ月'));

daysプロパティにアクセスすることで日数を参照できます。
ここでは365未満(1年未満)であれば、年の表示は無しでXヶ月と表示し、1年以上なら年も含めるようにしています。
なお、最後の行はシンプルなif else文であるため、三項演算子で表記しています。

おわりに

コードとしては特に難しい点はないですが、PHPで日付を扱った処理を初めて書いたので学びになりました。
皆さんの参考になれば嬉しいです。