DateInterval クラス
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
はじめに
日付の間隔をあらわします。
格納方式は、固定値 (年、月、日、時など) あるいは相対時刻 (DateTimeImmutable と DateTime のコンストラクタがサポートしている書式) となります。
さらに厳密に言うと、 DateInterval オブジェクトが保持している情報は、 ある date/time オブジェクトから別の date/time オブジェクトに情報を移す手順です。 この過程は必ずしも可逆ではありません。
DateInterval オブジェクトを生成する一般的なやり方は、 2つの date/time オブジェクトの差分を DateTimeInterface::diff() 経由で計算することです。
日付の間隔を比較する良い方法は定義されていません。 よって、DateInterval のインスタンスは 比較できません。
クラス概要
プロパティ
以下に示すプロパティが使えるかどうかは、 PHP のバージョンに依存します。 そして、readonly と見なすべきです。
- y
-
年。
- m
-
月。
- d
-
日。
- h
-
時間。
- i
-
分。
- s
-
秒。
- f
-
マイクロ秒。1秒の100万分の1です。
- invert
-
間隔が負の数になっている場合は
1
、そうでない場合は0
。 DateInterval::format() を参照ください。 - days
-
DateTimeImmutable::diff() や DateTime::diff() で作られた DateInterval オブジェクトの場合は、開始日と終了日の間の(丸一日、つまり0時から24時までの一日全体という意味での)日の数。 それ以外の場合は days は
false
となります。 - from_string
-
DateInterval::createFromDateString() で作られた DateInterval オブジェクトの場合は、 このプロパティの値は
true
になり、 date_string の値が収集されます。 そうでない場合、この値はfalse
になり、 y, f, invert, days の値が収集されます。 - date_string
-
DateInterval::createFromDateString() の引数として使われる文字列。
変更履歴
バージョン | 説明 |
---|---|
8.2.0 | DateInterval::createFromDateString() で作られた DateInterval のインスタンスのために、 プロパティ from_string と date_string が追加されました。 |
8.2.0 |
プロパティ y から f ,
invert , days
のみがアクセス可能になりました。
|
7.4.0 | DateInterval インスタンスは、 比較できなくなりました。 これより前のバージョンでは、 全ての DateInterval のインスタンスが等しいとみなされていました。 |
7.1.0 | f プロパティが追加されました |
目次
- DateInterval::__construct — 新しい DateInterval オブジェクトを作成する
- DateInterval::createFromDateString — 相対指定文字列から DateInterval を作成する
- DateInterval::format — 間隔をフォーマットする
User Contributed Notes 3 notes
If you want to reverse a date interval use array_reverse and iterator_to_array. I've found using invert to be unreliable.
<?php
$start_date = date_create("2021-01-01");
$end_date = date_create("2021-01-05"); // If you want to include this date, add 1 day
$interval = DateInterval::createFromDateString('1 day');
$daterange = new DatePeriod($start_date, $interval ,$end_date);
function show_dates ($dr) {
foreach($dr as $date1){
echo $date1->format('Y-m-d').'<br>';
}
}
show_dates ($daterange);
echo '<br>';
// reverse the array
$daterange = array_reverse(iterator_to_array($daterange));
show_dates ($daterange);
?>
Gives
2021-01-01
2021-01-02
2021-01-03
2021-01-04
2021-01-04
2021-01-03
2021-01-02
2021-01-01
More simple example i use to add or subtract.
<?php
$Datetime = new Datetime('NOW', new DateTimeZone('America/Bahia'));
$Datetime->add(DateInterval::createFromDateString('2 day'));
echo $Datetime->format("Y-m-d H:i:s");
?>
There is a handy way to compare intervals by adding them to 0 dates and comparing dates instead
<?php
function compare(DateInterval $first, DateInterval $second): int
{
$firstDate = (new DateTime())->setTimestamp(0)->add($first);
$secondDate = (new DateTime())->setTimestamp(0)->add($second);
return $firstDate <=> $secondDate;
}
echo compare(new DateInterval('P2D'), new DateInterval('PT48H')) . PHP_EOL;
echo compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('48 hours')) . PHP_EOL;
echo compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('49 hours')) . PHP_EOL;
echo compare(DateInterval::createFromDateString('2 days'), DateInterval::createFromDateString('47 hours')) . PHP_EOL;
?>
Outputs:
0
0
-1
1