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で月の日数を取得する方法についての記事でした
コメントを残す