PHPには、日付の操作にはDateTime型のDiff関数をコールすることで2つの日付の差を得ることができます。毎月の当月の日数を知る(11月なら30日、10月なら31日といった具合)方法が意外と手こずったので、一旦記事にして残しておこうと思います
目次
PHPの日付操作の基本
PHPにおいては、日付を扱うのは、ネットで一番見るのはDate型を利用した方法です
今日の日付を”2018/11/08″という形式で取得する場合は、以下のようにコードを記載すれば、今日の日付が確認できます
1 2 3 |
<?php echo date('Y/m/d'); ?> |
コード | 意味 |
---|---|
Y | 年(4桁) |
m | 月(2桁) |
d | 日(2桁) |
しかし、Date型は意外にできることがすくなく日数を計算するなどの処理は、DateTime型を利用する方が良さそうです。
今日の日付を上記のように得るだけなら、以下のようなコードになります
1 2 3 4 |
<?php $today=new DateTime(); echo $today->format('Y/m/d'); ?> |
なんか、少し面倒ですが一度、変数に入れた上でフォーマットを掛ける必要があります
DateTime型を利用した日付操作
ただ、DateTime型は、様々な日付操作を行うことができます
今日の日付を得るだけでなく、任意の日付を設定することも以下のようなコードで設定が可能です
1 2 3 4 5 |
<?php $targetday=new DateTime(); $targetday->setDate(2018,11,9); echo $targetday->format('Y/m/d'); ?> |
setDateメソッドを使い数値を利用した設定です。簡単ですね(年、月、日を数字で指定します)
また、modifyメソッドを利用することで、日付の内容を任意の状況に変えることができます
例えば、今月1日や来月1日をデータとして得ることも非常に簡単な操作で行うことができます
今月の1日を取得するなら以下のようなコードです
1 2 3 4 5 |
<?php $targetday=new DateTime(); $targetday->modify('first day of this month'); echo $targetday->format('Y/m/d'); ?> |
日付の差分の取得
日付の差分は、同様にdiffメソッドを使います。
以下の例は、今月の最終日($lastday)と最初の日($firstday)を指定して月の最後と最初の日の差分を表示します
1 2 3 4 5 6 7 8 9 10 11 12 |
<?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 "<br/>"; echo $firstday->format('Y/m/d'); echo "<br/>"; echo $diff->d ?> |
例えば上記の例2018年11月だと以下のように出力されます(改行は適当にいれています)
1 2 3 |
2018/11/30<br/> 2018/11/01<br/> 29 |
というわけで、表題の月の日付を計算するのは簡単!と思ったのですが、そうでもありませんでした
翌月初日と今月初日の差分は、日数が0になる!?
当然ながら、上記のコードがうまく行ったことを元にすれば、翌月の1日を指定すればOKと考え、まずは以下のコードを試しました
1 2 3 4 5 6 7 8 9 10 11 12 |
<?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 "<br/>"; echo $firstday->format('Y/m/d'); echo "<br/>"; echo $diff->d ?> |
結果は以下のとおり(2018年11月に実施)
1 2 3 |
2018/12/01<br/> 2018/11/01<br/> 0 |
あれ!?…予測の結果は30なのですが、どうやらdは一月以内の日数が表示される様子で、例えば以下のようなコードにするとmに1が表示されます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?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 "<br/>"; echo $firstday->format('Y/m/d'); echo "<br/>"; echo $diff->m; echo "<br/>"; echo $diff->d; ?> |
結果は以下のとおり(2018年11月に実施)
1 2 3 4 |
2018/12/01<br/> 2018/11/01<br/> 1<br/> 0 |
dateintervalの内容を確認して解決
DateTime型のdiffをとったときの返り値(上記のコードでいうところの$diff)はDateInterval型で返ってきます
そこで、DateInterval型についての以下のマニュアルサイトを参照してみました
この中に以下のような記述があります
days
DateTime::diff() で作られた DateInterval オブジェクトの場合は、開始日と終了日の間の日数。 それ以外の場合は days は FALSE となります。
どうやらコレを使うべきのようです
以下のようなコードにしてみました
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?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 "<br/>"; echo $firstday->format('Y/m/d'); echo "<br/>"; echo $diff->m; echo "<br/>"; echo $diff->d; echo "<br/>"; echo $diff->days; ?> |
結果は以下です
1 2 3 4 5 |
2018/12/01<br/> 2018/11/01<br/> 1<br/> 0<br/> 30 |
最後の「days」が思ったとおりの値になっています
以上 PHPで月の日数を取得する方法についての記事でした
コメントを残す