この記事を作成しようと思った理由
バッチ処理で月初に先月の1日から末日までの集計データを出力する必要があり下記のコードを見たが、これがどういう風な処理をしているのか理解できていなかったので、今回まとめることにしました。
# 今回理解したいコード
$start_date = date("Y/m/01 00:00:00", strtotime(date('Y/m/01') . " - 1 day"));
処理についての説明
前提として今日の日付を「2022年9月15日」として話をしていきます。
まず、この処理で行っていることを分解していきます。
ここで行われている処理について説明します。
strtotime(date('Y/m/01') . " - 1 day")
この処理は、今日の日付(2022年9月15日)から−1日しているという処理になります。
Y(今日の日付の年)、m(今日の日付の月)、d(今日の日付の日)となるので、
echo date("Y/m/d" strtotime(date('Y/m/d') . " - 1 day")));
と出力すると、2022/09/15から1日過去の2022/09/14という値が出力されます。
では、今回の処理strtotime(date('Y/m/01') . " - 1 day")に戻します。
この処理はどうなっているかというと
date('Y/m/01')は、Y(今日の日付の年)、m(今日の日付の月)、01日となるので、
strtotime(date('Y-m-01')." - 1 day")は、2022/09/01 -1 day となるので
echo date("Y/m/d, strtotime(date('Y/m/01') . " - 1 day"));
#出力される値 2022/08/31
となります。
ここまでの分解を整理してみましょう。
$start_date = date("Y/m/01", strtotime(date('Y/m/01') . " - 1 day"));
$start_date = date("Y/m/01", strtotime('2022/08/31'))
と分解することができました。
ここまでくると、あと1歩です。
date("Y/m/01", strtotime('2022/08/31'))という処理が行っていることは、2022/08/31という値を"Y/m/01 00:00:00" という形に成形することです。
すると、Y=2022, m=08, という値になり、日付は01で固定されているのでd=01となります。
echo date("Y/m/01", strtotime('2022/08/31'))
#出力される値 2022/08/01
これで2022年9月15日に、先月の1日である2022/08/01の値を出力することが可能になりました。
まとめ
理解しづらかったコードも処理を分解してみることで理解しやすくなりました。
日付に関しては、月末の日数が31日・30日とか閏年とか気をつけないといけない処理が多そうなので今後も勉強をしていきたいです。