3v4l.org

run code in 300+ PHP versions simultaneously
<?php $ss = 'first day of last month midnight'; $es = 'first day of this month midnight - 1 second'; $s = new DateTime($ss); $e = new DateTime($es); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 $s = (new DateTime(null))->setTimestamp(strtotime($ss)); // verbose setup method $e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method $d = $e->diff($s); var_dump($d->days); // 30 ... and should be 30 /* Next we will try mix/match the code to see what happens, surprisingly it seems that the end date ($e) is the important one, if it uses the verbose method it returns the correct values. */ $s = (new DateTime(null))->setTimestamp(strtotime($ss)); // verbose setup method $e = new DateTime($es); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 $s = new DateTime($ss); $e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method $d= $e->diff($s); var_dump($d->days); // 30 ... and should be 30 /* This test just proves that the $e date is important BUT NOT because it's the one we call the diff() method on, that's just coincidental that seems to imply that the "- 1 second" in the date string is the problem. */ $s = new DateTime($ss); $e = (new DateTime(null))->setTimestamp(strtotime($es)); // verbose setup method $d= $s->diff($e); var_dump($d->days); // 30 ... and should be 30 /* [Workaround] This final test seems to prove that the input string is important and that the "- 1 secord" has a negative knock-on effect on the results of the diff. By modifying the datetime with ->modify everything works as expected ... it just means you have to be careful of how we work with DateTimes . */ $s = new DateTime($ss); $e = new DateTime('first day of this month midnight'); $e->modify('- 1 second'); var_dump($e->diff($s)->days); // 30 ... and should be 30 echo "\n\n Same stuff with DateTimeImmutable\n"; $ss = 'first day of last month midnight'; $es = 'first day of this month midnight - 1 second'; $s = new DateTimeImmutable($ss); $e = new DateTimeImmutable($es); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 $s = (new DateTimeImmutable(null))->setTimestamp(strtotime($ss)); // verbose setup method $e = (new DateTimeImmutable(null))->setTimestamp(strtotime($es)); // verbose setup method $d = $e->diff($s); var_dump($d->days); // 30 ... and should be 30 /* Next we will try mix/match the code to see what happens, surprisingly it seems that the end date ($e) is the important one, if it uses the verbose method it returns the correct values. */ $s = (new DateTimeImmutable(null))->setTimestamp(strtotime($ss)); // verbose setup method $e = new DateTimeImmutable($es); $d= $e->diff($s); var_dump($d->days); // 0 ... but should be 30 $s = new DateTimeImmutable($ss); $e = (new DateTimeImmutable(null))->setTimestamp(strtotime($es)); // verbose setup method $d= $e->diff($s); var_dump($d->days); // 30 ... and should be 30 /* This test just proves that the $e date is important BUT NOT because it's the one we call the diff() method on, that's just coincidental that seems to imply that the "- 1 second" in the date string is the problem. */ $s = new DateTimeImmutable($ss); $e = (new DateTimeImmutable(null))->setTimestamp(strtotime($es)); // verbose setup method $d= $s->diff($e); var_dump($d->days); // 30 ... and should be 30 /* [Workaround] This final test seems to prove that the input string is important and that the "- 1 secord" has a negative knock-on effect on the results of the diff. By modifying the datetime with ->modify everything works as expected ... it just means you have to be careful of how we work with DateTimes . */ $s = new DateTimeImmutable($ss); $e = new DateTimeImmutable('first day of this month midnight'); $e->modify('- 1 second'); var_dump($e->diff($s)->days); // 30 ... and should be 30
Output for git.master, git.master_jit, rfc.property-hooks
int(30) Deprecated: DateTime::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 9 Deprecated: DateTime::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 10 int(30) Deprecated: DateTime::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 17 int(30) Deprecated: DateTime::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 22 int(30) Deprecated: DateTime::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 30 int(30) int(30) Same stuff with DateTimeImmutable int(30) Deprecated: DateTimeImmutable::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 53 Deprecated: DateTimeImmutable::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 54 int(30) Deprecated: DateTimeImmutable::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 61 int(30) Deprecated: DateTimeImmutable::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 66 int(30) Deprecated: DateTimeImmutable::__construct(): Passing null to parameter #1 ($datetime) of type string is deprecated in /in/6Zjq5 on line 74 int(30) int(31)

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
63.24 ms | 404 KiB | 8 Q