[PHP]月の日数を取得する方法

広告

PHPには、日付の操作にはDateTime型のDiff関数をコールすることで2つの日付の差を得ることができます。毎月の当月の日数を知る(11月なら30日、10月なら31日といった具合)方法が意外と手こずったので、一旦記事にして残しておこうと思います

目次

PHPの日付操作の基本

PHPにおいては、日付を扱うのは、ネットで一番見るのはDate型を利用した方法です

今日の日付を”2018/11/08″という形式で取得する場合は、以下のようにコードを記載すれば、今日の日付が確認できます


この場合、Y、m、dは以下のような意味があります

コード 意味
Y 年(4桁)
m 月(2桁)
d 日(2桁)

しかし、Date型は意外にできることがすくなく日数を計算するなどの処理は、DateTime型を利用する方が良さそうです。
今日の日付を上記のように得るだけなら、以下のようなコードになります


なんか、少し面倒ですが一度、変数に入れた上でフォーマットを掛ける必要があります

DateTime型を利用した日付操作

ただ、DateTime型は、様々な日付操作を行うことができます

今日の日付を得るだけでなく、任意の日付を設定することも以下のようなコードで設定が可能です

<?php
$targetday=new DateTime();
$targetday->setDate(2018,11,9);
echo $targetday->format('Y/m/d');
?>

setDateメソッドを使い数値を利用した設定です。簡単ですね(年、月、日を数字で指定します)

また、modifyメソッドを利用することで、日付の内容を任意の状況に変えることができます

例えば、今月1日や来月1日をデータとして得ることも非常に簡単な操作で行うことができます

今月の1日を取得するなら以下のようなコードです

<?php
$targetday=new DateTime();
$targetday->modify('first day of this month');
echo $targetday->format('Y/m/d');
?>

詳しい使い方は、こちらを参照してください

日付の差分の取得

日付の差分は、同様にdiffメソッドを使います。
以下の例は、今月の最終日($lastday)と最初の日($firstday)を指定して月の最後と最初の日の差分を表示します

<?php
$lastday=new DateTime();
$lastday->modify('last day of this month');
$firstday=new DateTime();
$firstday->modify('first day of this month');
$diff=$lastday->diff($firstday);
echo $lastday->format('Y/m/d');
echo "
"; echo $firstday->format('Y/m/d'); echo "
"; echo $diff->d ?>

例えば上記の例2018年11月だと以下のように出力されます(改行は適当にいれています)

2018/11/30
2018/11/01
29

というわけで、表題の月の日付を計算するのは簡単!と思ったのですが、そうでもありませんでした

翌月初日と今月初日の差分は、日数が0になる!?

当然ながら、上記のコードがうまく行ったことを元にすれば、翌月の1日を指定すればOKと考え、まずは以下のコードを試しました

<?php
$lastday=new DateTime();
$lastday->modify('first day of next month');
$firstday=new DateTime();
$firstday->modify('first day of this month');
$diff=$lastday->diff($firstday);
echo $lastday->format('Y/m/d');
echo "
"; echo $firstday->format('Y/m/d'); echo "
"; echo $diff->d ?>

結果は以下のとおり(2018年11月に実施)

2018/12/01
2018/11/01
0

あれ!?…予測の結果は30なのですが、どうやらdは一月以内の日数が表示される様子で、例えば以下のようなコードにするとmに1が表示されます

<?php
$lastday=new DateTime();
$lastday->modify('first day of next month');
$firstday=new DateTime();
$firstday->modify('first day of this month');
$diff=$lastday->diff($firstday);
echo $lastday->format('Y/m/d');
echo "
"; echo $firstday->format('Y/m/d'); echo "
"; echo $diff->m; echo "
"; echo $diff->d; ?>

結果は以下のとおり(2018年11月に実施)

2018/12/01
2018/11/01
1
0

dateintervalの内容を確認して解決

DateTime型のdiffをとったときの返り値(上記のコードでいうところの$diff)はDateInterval型で返ってきます

そこで、DateInterval型についての以下のマニュアルサイトを参照してみました

この中に以下のような記述があります

days
DateTime::diff() で作られた DateInterval オブジェクトの場合は、開始日と終了日の間の日数。 それ以外の場合は days は FALSE となります。

どうやらコレを使うべきのようです
以下のようなコードにしてみました

<?php
$lastday=new DateTime();
$lastday->modify('first day of next month');
$firstday=new DateTime();
$firstday->modify('first day of this month');
$diff=$lastday->diff($firstday);
echo $lastday->format('Y/m/d');
echo "
"; echo $firstday->format('Y/m/d'); echo "
"; echo $diff->m; echo "
"; echo $diff->d; echo "
"; echo $diff->days; ?>

結果は以下です

2018/12/01
2018/11/01
1
0
30

最後の「days」が思ったとおりの値になっています

以上 PHPで月の日数を取得する方法についての記事でした

広告

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です