php[world] 2015 Call for Speakers

DateInterval::__construct

(PHP 5 >= 5.3.0)

DateInterval::__constructErstellt ein neues DateInterval Objekt

Beschreibung

public DateInterval::__construct ( string $interval_spec )

Erstellt ein neues DateInterval Objekt.

Parameter-Liste

interval_spec

Eine Intervall Spezifikation

Das Format beginnt mit dem Buchstaben P für "period". Jede Periodendauer wird als Integer-Wert, gefolgt von einem Perioden-Bezeichner, repräsentiert. Enthält die Dauer Zeitelemente, steht diesem Teil der Spezifikation der Buchstabe T voran.

interval_spec Perioden Bezeichner
Perioden Bezeichner Beschreibung
Y Jahre
M Monate
D Tage
W Wochen. Diese werden in Tage umgerechnet und können daher nicht mit D kombiniert werden.
H Stunden
M Minuten
S Sekunden

Hier sind ein paar einfache Beispiele. Zwei Tage sind P2D. Zwei Sekunden sind PT2S. Sechs Jahre und fünf Minuten ist P6YT5M.

Hinweis:

Die Einheitstypen müssen von der größten Einheit von Links zur kleinsten Einheit nach rechts angegeben werden. Also Jahre vor Monate, Monate vor Tage, Tage vor Minuten etc. Also muss ein Jahr und vier Tage als P1Y4D dargestellt werden, nicht als P4D1Y.

Die Spezifikation kann aber auch als Zeitstempel angegeben werden. Ein Beispiel für ein Jahr und vier Tage wäre also P0001-00-04T00:00:00. Die Werte in diesem Format können allerdings den jeweiligen Übersprungspunkt der Periode nicht überschreiten (z.B. ist 25 Stunden ungültig).

Diese Formate basieren auf der » ISO 8601 Dauer-Spezifikation.

Fehler/Exceptions

Wirft eine Exception, wenn interval_spec nicht als Intervall geparst werden kann.

Beispiele

Beispiel #1 DateInterval Beispiel

<?php

$interval 
= new DateInterval('P2Y4DT6H8M');
var_dump($interval);

?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

object(DateInterval)#1 (8) {
  ["y"]=>
  int(2)
  ["m"]=>
  int(0)
  ["d"]=>
  int(4)
  ["h"]=>
  int(6)
  ["i"]=>
  int(8)
  ["s"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
}

Siehe auch

  • DateInterval::format() - Formats the interval
  • DateTime::add() - Addiert einen Wert von Tagen, Monaten, Jahren, Stunden, Minuten und Sekunden zu einem DateTime-Objekt
  • DateTime::sub() - Subtrahiert eine Anzahl von Tagen, Monaten, Jahren, Stunden, Minuten und Sekunden von einem DateTime-Objekt.
  • DateTime::diff() - Returns the difference between two DateTime objects

add a note add a note

User Contributed Notes 8 notes

up
14
owen at beliefs.com
1 year ago
M is used to indicate both months and minutes.

As noted on the referenced wikipedia page for ISO 6801 http://en.wikipedia.org/wiki/Iso8601#Durations

To resolve ambiguity, "P1M" is a one-month duration and "PT1M" is a one-minute duration (note the time designator, T, that precedes the time value).

Using: PHP 5.3.2-1ubuntu4.19

// For 3 Months
$dateTime = new DateTime;echo $dateTime->format( DateTime::ISO8601 ), PHP_EOL;
$dateTime->add(new DateInterval("P3M"));
echo $dateTime->format( DateTime::ISO8601 ), PHP_EOL;
Results in:
2013-07-11T11:12:26-0400
2013-10-11T11:12:26-0400

// For 3 Minutes
$dateTime = new DateTime;echo $dateTime->format( DateTime::ISO8601 ), PHP_EOL;
$dateTime->add(new DateInterval("PT3M"));
echo $dateTime->format( DateTime::ISO8601 ), PHP_EOL;
Results in:
2013-07-11T11:12:42-0400
2013-07-11T11:15:42-0400

Insert a T after the P in the interval to add 3 minutes instead of 3 months.
up
6
daniellehr at gmx dot de
3 years ago
Alternatively you can use DateInterval::createFromDateString() for negative intervals:

<?php
$date
= new DateTime();
$date->add(DateInterval::createFromDateString('-89 days'));
up
9
buvinghausen at gmail dot com
3 years ago
I think it is easiest if you would just use the sub method on the DateTime class.

<?php
$date
= new DateTime();
$date->sub(new DateInterval("P89D"));
up
9
kuzb
4 years ago
It should be noted that this class will not calculate days/hours/minutes/seconds etc given a value in a single denomination of time.  For example:

<?php
    $di
= new DateInterval('PT3600S');
    echo
$di->format('%H:%i:%s');
   
?>

will yield 0:0:3600 instead of the expected 1:0:0
up
3
jawzx01 at gmail dot com
3 years ago
As previously mentioned, to do a negative DateInterval object, you'd code:

<?php
$date1
= new DateTime();
$eightynine_days_ago = new DateInterval( "P89D" );
$eightynine_days_ago->invert = 1; //Make it negative.
$date1->add( $eightynine_days_ago );
?>

and then $date1 is now 89 days in the past.
up
1
admin at torntech dot com
3 months ago
Warning - despite the $interval_spec accepting the ISO 8601 specification format, it does not accept decimal fraction values with period or comma as stated in the specification.

https://bugs.php.net/bug.php?id=53831

<?php
/* Example from ISO 8601 documentation */
$interval = new DateInterval('P0.5Y');
?>

Will result in
Fatal error: Uncaught exception 'Exception' with message 'DateInterval::__construct(): Unknown or bad format (P0.5Y)'
up
1
kevinpeno at gmail dot com
4 years ago
Note that, while a DateInterval object has an $invert property, you cannot supply a negative directly to the constructor similar to specifying a negative in XSD ("-P1Y"). You will get an exception through if you do this.

Instead you need to construct using a positive interval ("P1Y") and the specify the $invert property === 1.
up
-3
bkilinc at deyta dot net
1 year ago
interval_spec Period Designators, has two 'M's for months and minutes.
To Top