Bug #79104 [Asn]: Relative DateInterval Creates Infinite Loop

From: Date: Thu, 23 Jan 2020 21:41:55 +0000
Subject: Bug #79104 [Asn]: Relative DateInterval Creates Infinite Loop
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-225083@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=79104&edit=1

 ID:                 79104
 User updated by:    jimbo2150 at gmail dot com
 Reported by:        jimbo2150 at gmail dot com
 Summary:            Relative DateInterval Creates Infinite Loop
 Status:             Assigned
 Type:               Bug
 Package:            Date/time related
 PHP Version:        7.3.13
 Assigned To:        derick
 Block user comment: N
 Private report:     N

 New Comment:

Not sure what you mean by the numbers you are looking for.

I got closer with this code (added "next year" to the DatePeriod object, but the result is
erratic (not sure what is being calculated):


$fmj = DateInterval::createFromDateString('first Monday of January next year');

$period = new DatePeriod(new DateTime('first Monday of January 2020'), $fmj, new
DateTime('2022-01-31'));

foreach ($period as $dt) {
    var_dump($dt->format("l Y-m-d H:i:s"));
}

// Strange, incorrect output (not the first Monday of January 2021 or 2022):
string(26) "Monday 2020-01-06 00:00:00"
string(29) "Wednesday 2021-01-06 00:00:00"
string(27) "Tuesday 2022-01-04 00:00:00"


Previous Comments:
------------------------------------------------------------------------
[2020-01-19 11:04:57] a at b dot c dot de

Looks like it can't determine how long "first Monday of January" is.

echo $fmj->format('%y years, %m months, %d days, %h hours, %i minutes, %s seconds');

What numbers should it be using for those fields?

------------------------------------------------------------------------
[2020-01-11 21:42:39] jimbo2150 at gmail dot com

Description:
------------
A relative date format used in DateInterval produces and infinite loop when used with DatePeriod.

An example is looking for the first Monday in January of each year. When iterated via DatePeriod the
year will not get iterated and the correct relative date for current year keeps getting returned
creating an infinite loop.

Test script:
---------------
// Looking for every Monday of January each year
$fmj = DateInterval::createFromDateString('first Monday of January');

$period = new DatePeriod(new DateTime('2020-01-01'), $fmj, new
DateTime('2022-01-11'));

// Infinite loop, first Monday of January of current year keeps getting iterated
foreach ($period as $dt) {
    var_dump($dt->format("l Y-m-d H:i:s"));
}

Expected result:
----------------
Return each first Monday of January for the next 2 years.

string(30) "Wednesday 2020-01-01 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
string(27) "Monday 2021-01-04 00:00:00"
string(27) "Monday 2022-01-03 00:00:00"

Actual result:
--------------
Infinite loop where each date is the first Monday of the current year's January.

string(30) "Wednesday 2020-01-01 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
string(27) "Monday 2020-01-06 00:00:00"
...
{infinite loop}


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=79104&edit=1


Thread (10 messages)

« previous php.bugs (#225083) next »