こんにちは。よっしーです(^^)
今日は、PHPで任意の日時に対して加算する方法についてご紹介します。
前提
この記事で使用するPHPのバージョンは下記になります。
% php --version
PHP 8.2.7 (cli) (built: Jul 3 2023 00:38:48) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
PHPのバージョン指定は、下記のコマンドで実施しています。
asdf local php 8.2.7
asdfコマンドについては、下記の記事を御覧ください。
背景
PHPで特定の日時に対して、加算する処理をしないと行けない場面があり、よく忘れるのでやり方を備忘の意味を込めて、記事に残しました。
サンプル1
現在日時に加算する例になります。
下記の内容で、01.php ファイルを新規作成して、保存します。
<?php
$before = new DateTimeImmutable();
$duration = sprintf('PT%dS', 3600);
$after = $before->add(new DateInterval($duration));
echo sprintf('before : %s' . PHP_EOL, $before->format('Y-m-d H:i:s'));
echo sprintf('after : %s' . PHP_EOL, $after->format('Y-m-d H:i:s'));
下記のコマンドを実施します。
php 01.php
下記のような結果になれば成功です。
% php 01.php
before : 2023-07-26 13:40:35
after : 2023-07-26 14:40:35
サンプル2
特定の日時を指定して、加算する例になります。
下記の内容で、02.php ファイルを新規作成して、保存します。
<?php
$before = new DateTimeImmutable('2023-07-27 00:00:00');
$duration = sprintf('PT%dS', 3600);
$after = $before->add(new DateInterval($duration));
echo sprintf('before : %s' . PHP_EOL, $before->format('Y-m-d H:i:s'));
echo sprintf('after : %s' . PHP_EOL, $after->format('Y-m-d H:i:s'));
下記のコマンドを実施します。
php 02.php
下記のような結果になれば成功です。
% php 02.php
before : 2023-07-27 00:00:00
after : 2023-07-27 01:00:00
解説
02.php
解説:
$before
変数:DateTimeImmutable
オブジェクトを作成し、指定した日時「2023-07-27 00:00:00」で初期化しています。DateTimeImmutable
は変更不可能なオブジェクトであるため、後でこのオブジェクトの値を変更することはできません。$duration
変数: 1時間(3600秒)を表す期間を表す文字列「PT3600S」を作成しています。PT
は「Period of Time」を意味し、S
は「Seconds」を表します。$after
変数:$before
変数にadd()
メソッドを使って$duration
変数(1時間の期間)を加算し、新しいDateTimeImmutable
オブジェクトを作成しています。これにより、元の$before
オブジェクトの値を変更せずに、新しい日時を取得できます。- 最後に、
$before
変数と$after
変数の値をそれぞれformat()
メソッドを使って文字列としてフォーマットして表示しています。結果では、「2023-07-27 00:00:00」と「2023-07-27 01:00:00」が表示されていることが分かります。
DateTimeImmutable
DateTimeImmutable
は、PHPの組み込みクラスであり、日付と時間を表現するために使用されます。DateTimeImmutable
オブジェクトは、一度作成された後に変更できない(immutable)オブジェクトです。つまり、一度値が設定されると、その値を変更することはできません。新しいDateTimeImmutable
オブジェクトを作成することで、変更したバージョンの日付と時間を取得できます。
DateTimeImmutable
クラスは、DateTime
クラスの変更不可能なバージョンです。DateTime
クラスは、元のオブジェクトの値を変更することができますが、DateTimeImmutable
は変更不可能なので、一度作成されたオブジェクトの値は永続的に保持されます。
主な特徴:
- 変更不可能性:
DateTimeImmutable
オブジェクトは、作成後にその値を変更することができません。変更を加えたい場合は、新しいオブジェクトを作成する必要があります。 - 安全性: 変更不可能なオブジェクトは、意図しない変更を防ぐことができます。特に、並行処理やオブジェクトの共有が必要な場合に安全です。
- イミュータブルメソッド:
DateTimeImmutable
はDateTime
のメソッドと同様のメソッドを提供しますが、これらのメソッドは元のオブジェクトを変更するのではなく、変更後の新しいオブジェクトを返します。
DateTimeImmutable
は、日付や時間を変更せずに新しいオブジェクトを作成する必要がある場合に非常に便利です。特に、関数やメソッドの戻り値として使用すると、プログラムの安全性と保守性を高めるのに役立ちます。
DateTimeImmutable
DateInterval
は、PHPの組み込みクラスであり、日付や時間の間隔を表現するために使用されます。主に、DateTime
オブジェクトと組み合わせて、日付の加算や減算、期間の計算、日付の差分の計算などに利用されます。
DateInterval
オブジェクトは、年数、月数、日数、時間、分、秒などの間隔を保持します。これにより、非常に柔軟な期間を表現できます。
DateInterval
オブジェクトを作成するには、DateInterval
クラスのコンストラクタを使用します。コンストラクタには、期間を表す文字列を渡します。この文字列には、以下のフォーマットを使用します:
P1Y2M3DT4H5M6S
P
: Periodの略で、期間を表すことを示します。1Y
: 1年間を表します。2M
: 2ヶ月間を表します。3D
: 3日間を表します。- T: Timeの略で、時間を表すことを示します。
4H
: 4時間を表します。5M
: 5分を表します。6S
: 6秒を表します。
例えば、上記の文字列は「1年2ヶ月3日4時間5分6秒」という期間を表します。
DateInterval
は、日付と時間の計算に非常に便利なクラスであり、特にDateTime
と組み合わせて使用されることがよくあります。また、特定の日付の間隔を表す際にも使用されます。
おわりに
今日は、PHPで任意の日時に対して加算する方法についてご紹介しました。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント