PHPプログラマーの松永です。
今回はDateTimeを使用した特定日から特定日までの日数を取得する方法を紹介します。
目次
strtotime
日付の処理ができる関数として、strtotimeがあります。
ただ、公式のPHPマニュアルのstrtotimeのページを見ると下記が記載されています。
注意: この関数を使って日付の足し算や引き算を行うことはおすすめできません。 PHP 5.3 以降なら DateTime::add() や DateTime::sub() を、そして PHP 5.2 なら DateTime::modify() を使いましょう。
strtotimeは、「日付の足し算や引き算を行うことはおすすめできません。」とあり、「特定日から特定日までの日数を取得する方法」としてはstrtotimeを使用することができません。
そこで今回は、PHPマニュアルに記載されているDateTimeを使用し、公式のアナウンスに準拠した処理で特定日から特定日までの日数を取得してみますう。
DateTime
DateTimeはnew
をしないと使用することができません。
このnew
というのは、定義されているクラスをインスタンス化する働きがあります。
そのため、newなしにDateTimeを使用するとエラーになりますので注意してください。
では、実際のコードを見ていきましょう。
コード
コードの想定としては、何かツールやサービスの使用開始日を$start
、使用終了日を$end
とし、開始日と終了日は何日間かを算出する処理を想定しています。
$start = new DateTime('2020-12-01');
$end = new DateTime('2021-03-11');
$intervalDays = $start->diff($end);
$useDays = $intervalDays->format('%a');
var_dump($useDays);
// string(3) "100"
コードとしては、とてもシンプルですよね。
使用開始日を元に、使用終了日をDateTimeのdiffに渡してあげるとDateTimeが何日間かを算出してくれます。
実装者側が、月の最終日が28日か、30日か、31日かということをまったく気にすることなく算出できてしまいます。
便利ですよね。
この月の最終日の取得処理が間違っていたりするとバグになり、バグの影響範囲が日付処理全体という広範囲になるため気をつけなければいけません。
バグや運用を考慮するとDateTimeを使用することはとてもメリットがある方法の1つだと考えています。
DateTimeにはdiff
やformat
の他にも色々なメソッドがあります。
今回出てきたメソッドの他に、「どのようなメソッドがあり、どのようなことができるか」を確認してみることをおすすめします。
もしかすると今まで敬遠しがちだった処理をDateTimeが変わりに行ってくれるかもしれませんね。
PHPマニュアル - DateTime クラス https://www.php.net/manual/ja/class.datetime.php
以上でございます。
まとめ
実装者側が0から式を立て、計算するということもよいと思いますが、使用する言語に元から備わっている便利な関数は積極的に使用していくことをおすすめします。
「簡単に特定日から特定日までの日数を取得したい」という方の参考になれば幸いです。