DateInterval::createFromDateString

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

DateInterval::createFromDateStringSets up a DateInterval from the relative parts of the string

Description

Object-oriented style

public static DateInterval::createFromDateString(string $datetime): DateInterval

Procedural style

Uses the date/time parsers as used in the DateTimeImmutable constructor to create a DateInterval from the relative parts of the parsed string.

Parameters

datetime

A date with relative parts. Specifically, the relative formats supported by the parser used for DateTimeImmutable , DateTime , and strtotime() will be used to construct the DateInterval.

To use an ISO-8601 format string like P7D, you must use the DateInterval::__construct() .

Return Values

Returns DateInterval on success. Procedural style returns false on failure.

Errors/Exceptions

Object Oriented API only: If an invalid Date/Time string is passed, DateMalformedStringException is thrown.

Changelog

Version Description
8.3.0 DateInterval::createFromDateString() now throws DateMalformedStringException if an invalid string is passed. Previously, it returned false, and a warning was emitted. date_interval_create_from_date_string() has not been changed.
8.2.0 Only the from_string and date_string properties will be visible when a DateInterval is created with this method.

Examples

Example #1 Parsing valid date intervals

<?php
// Each set of intervals is equal.
$i = new DateInterval('P1D');
$i = DateInterval::createFromDateString('1 day');

$i = new DateInterval('P2W');
$i = DateInterval::createFromDateString('2 weeks');

$i = new DateInterval('P3M');
$i = DateInterval::createFromDateString('3 months');

$i = new DateInterval('P4Y');
$i = DateInterval::createFromDateString('4 years');

$i = new DateInterval('P1Y1D');
$i = DateInterval::createFromDateString('1 year + 1 day');

$i = new DateInterval('P1DT12H');
$i = DateInterval::createFromDateString('1 day + 12 hours');

$i = new DateInterval('PT3600S');
$i = DateInterval::createFromDateString('3600 seconds');
?>

Example #2 Parsing combinations and negative intervals

<?php
$i
= DateInterval::createFromDateString('62 weeks + 1 day + 2 weeks + 2 hours + 70 minutes');
echo
$i->format('%d %h %i'), "\n";

$i = DateInterval::createFromDateString('1 year - 10 days');
echo
$i->format('%y %d'), "\n";
?>

The above example will output:


449 2 70
1 -10

Example #3 Parsing special relative date intervals

<?php
$i
= DateInterval::createFromDateString('last day of next month');
var_dump($i);

$i = DateInterval::createFromDateString('last weekday');
var_dump($i);

Output of the above example in PHP 8.2:

object(DateInterval)#1 (2) {
 ["from_string"]=>
 bool(true)
 ["date_string"]=>
 string(22) "last day of next month"
}
object(DateInterval)#2 (2) {
 ["from_string"]=>
 bool(true)
 ["date_string"]=>
 string(12) "last weekday"
}

Output of the above example in PHP 8 is similar to:

object(DateInterval)#1 (16) {
 ["y"]=>
 int(0)
 ["m"]=>
 int(1)
 ["d"]=>
 int(0)
 ["h"]=>
 int(0)
 ["i"]=>
 int(0)
 ["s"]=>
 int(0)
 ["f"]=>
 float(0)
 ["weekday"]=>
 int(0)
 ["weekday_behavior"]=>
 int(0)
 ["first_last_day_of"]=>
 int(2)
 ["invert"]=>
 int(0)
 ["days"]=>
 bool(false)
 ["special_type"]=>
 int(0)
 ["special_amount"]=>
 int(0)
 ["have_weekday_relative"]=>
 int(0)
 ["have_special_relative"]=>
 int(0)
}
object(DateInterval)#2 (16) {
 ["y"]=>
 int(0)
 ["m"]=>
 int(0)
 ["d"]=>
 int(0)
 ["h"]=>
 int(0)
 ["i"]=>
 int(0)
 ["s"]=>
 int(0)
 ["f"]=>
 float(0)
 ["weekday"]=>
 int(0)
 ["weekday_behavior"]=>
 int(0)
 ["first_last_day_of"]=>
 int(0)
 ["invert"]=>
 int(0)
 ["days"]=>
 bool(false)
 ["special_type"]=>
 int(1)
 ["special_amount"]=>
 int(-1)
 ["have_weekday_relative"]=>
 int(0)
 ["have_special_relative"]=>
 int(1)
}

Found A Problem?

Learn How To Improve This PageSubmit a Pull RequestReport a Bug
+add a note

User Contributed Notes 1 note

up
0
felix dot edelmann at check24 dot de
7 months ago
Please note that Daylight Saving Time (DST) transitions only work as expected when using new \DateInterval(), not \DateInterval::createFromDateString().

<?php
$now
= new \DateTimeImmutable("2025-03-29 13:00:00", new DateTimeZone('Europe/Berlin'));
var_dump($now);
// 2025年03月29日 13:00:00

var_dump($now->add(\DateInterval::createFromDateString('1440 minutes')));
// 2025年03月30日 13:00:00
var_dump($now->add(new \DateInterval('PT1440M')));
// 2025年03月30日 14:00:00

// these are not equivalent:
var_dump(\DateInterval::createFromDateString('1440 minutes'));
var_dump(new \DateInterval('PT1440M'));
?>
+add a note

AltStyle によって変換されたページ (->オリジナル) /