PHP Conference Japan 2024

DateInterval 類別

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

簡介

表示日期區間。

日期區間儲存一段固定的時間量(以年、月、日、小時等為單位),或是一個相對時間字串,格式與 DateTimeImmutableDateTime 建構函式支援的格式相同。

更具體地說,DateInterval 類別物件中的資訊是用於從一個日期/時間取得另一個日期/時間的指示。這個過程並不總是可逆的。

建立 DateInterval 物件的常見方法是透過 DateTimeInterface::diff() 計算兩個日期/時間物件的差異。

由於沒有明確定義比較日期區間的方法,DateInterval 實例是不可比較的

類別概要

class DateInterval {
/* 屬性 */
public int $y;
public int $m;
public int $d;
public int $h;
public int $i;
public int $s;
public float $f;
public int $invert;
public mixed $days;
/* 方法 */
public __construct(string $duration)
public static createFromDateString(string $datetime): DateInterval
public format(string $format): string
}

屬性

警告

以下列出的可用屬性取決於 PHP 版本,並且應被視為*唯讀*。

y

年數。

m

月數。

d

天數。

h

小時數。

i

分鐘數。

s

秒數。

f

微秒數,以一秒的小數表示。

invert

如果時間區間代表負時間段則為 1,否則為 0。詳見 DateInterval::format()

days

如果 DateInterval 物件是由 DateTimeImmutable::diff()DateTime::diff() 建立,則這是起始日期和結束日期之間的完整天數。否則,days 將為 false

from_string

如果 DateInterval 物件是由 DateInterval::createFromDateString() 建立,則此屬性的值將為 true,並且 date_string 屬性將會被填入值。否則,該值將為 false,並且 yfinvertdays 屬性將會被填入值。

date_string

用作 DateInterval::createFromDateString() 參數的字串。

更新日誌

版本 說明
8.2.0 針對使用 DateInterval::createFromDateString() 方法建立的 DateInterval 實例,新增了 from_stringdate_string 屬性。
8.2.0 只有 yfinvertdays 會顯示。
7.4.0 DateInterval 實例現在無法比較;先前,所有 DateInterval 實例都被視為相等。
7.1.0 新增了 f 屬性。

目錄

新增註解

使用者貢獻的註解 3 則註解

cb
2 年前
如果您想反轉日期區間,請使用 array_reverse 和 iterator_to_array。我發現使用 invert 並不可靠。

<?php
$start_date
= date_create("2021-01-01");
$end_date = date_create("2021-01-05"); // 如果要包含這個日期,請加 1 天

$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>';

// 反轉陣列

$daterange = array_reverse(iterator_to_array($daterange));

show_dates ($daterange);

?>

結果
2021-01-01
2021-01-02
2021-01-03
2021-01-04

2021-01-04
2021-01-03
2021-01-02
2021-01-01
julio dot necronomicon at gmail dot com
10 個月前
我用來加減的更簡單的例子。

<?php
$Datetime
= new Datetime('NOW', new DateTimeZone('America/Bahia'));
$Datetime->add(DateInterval::createFromDateString('2 day'));

echo
$Datetime->format("Y-m-d H:i:s");
?>
edgaras at levinson dot lt
4 個月前
有一個方便的方法可以比較時間間隔,方法是將它們添加到 0 日期,然後比較日期。

<?php

函式 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;

?>

輸出
0
0
-1
1
To Top