Skip to content

Commit ec0771c

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
2 parents d1dc710 + 789f6b8 commit ec0771c

File tree

2 files changed

+72
-11
lines changed

2 files changed

+72
-11
lines changed

ext/date/php_date.c

+20-11
Original file line numberDiff line numberDiff line change
@@ -1451,16 +1451,6 @@ static int date_period_it_has_more(zend_object_iterator *iter)
14511451
{
14521452
date_period_it *iterator = (date_period_it *)iter;
14531453
php_period_obj *object = Z_PHPPERIOD_P(&iterator->intern.data);
1454-
timelib_time *it_time = object->current;
1455-
1456-
/* apply modification if it's not the first iteration */
1457-
if (!object->include_start_date || iterator->current_index > 0) {
1458-
it_time->have_relative = 1;
1459-
it_time->relative = *object->interval;
1460-
it_time->sse_uptodate = 0;
1461-
timelib_update_ts(it_time, NULL);
1462-
timelib_update_from_sse(it_time);
1463-
}
14641454

14651455
if (object->end) {
14661456
return object->current->sse < object->end->sse ? SUCCESS : FAILURE;
@@ -1502,10 +1492,23 @@ static void date_period_it_current_key(zend_object_iterator *iter, zval *key)
15021492
}
15031493
/* }}} */
15041494

1495+
static void date_period_advance(timelib_time *it_time, timelib_rel_time *interval)
1496+
{
1497+
it_time->have_relative = 1;
1498+
it_time->relative = *interval;
1499+
it_time->sse_uptodate = 0;
1500+
timelib_update_ts(it_time, NULL);
1501+
timelib_update_from_sse(it_time);
1502+
}
1503+
15051504
/* {{{ date_period_it_move_forward */
15061505
static void date_period_it_move_forward(zend_object_iterator *iter)
15071506
{
1508-
date_period_it *iterator = (date_period_it *)iter;
1507+
date_period_it *iterator = (date_period_it *)iter;
1508+
php_period_obj *object = Z_PHPPERIOD_P(&iterator->intern.data);
1509+
timelib_time *it_time = object->current;
1510+
1511+
date_period_advance(it_time, object->interval);
15091512

15101513
iterator->current_index++;
15111514
date_period_it_invalidate_current(iter);
@@ -1525,7 +1528,13 @@ static void date_period_it_rewind(zend_object_iterator *iter)
15251528
zend_throw_error(NULL, "DatePeriod has not been initialized correctly");
15261529
return;
15271530
}
1531+
15281532
iterator->object->current = timelib_time_clone(iterator->object->start);
1533+
1534+
if (!iterator->object->include_start_date) {
1535+
date_period_advance(iterator->object->current, iterator->object->interval);
1536+
}
1537+
15291538
date_period_it_invalidate_current(iter);
15301539
}
15311540
/* }}} */
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
--TEST--
2+
Date Period iterators do not advance on valid()
3+
--FILE--
4+
<?php
5+
6+
$start = DateTime::createFromFormat('Y-m-d', '2022-01-01');
7+
$end = DateTime::createFromFormat('Y-m-d', '2022-01-04');
8+
$interval = DateInterval::createFromDateString('1 day');
9+
$period = new DatePeriod($start, $interval, $end);
10+
$iterator = $period->getIterator();
11+
12+
foreach ($iterator as $item) {
13+
echo $item->format('Y-m-d') . "\n";
14+
}
15+
16+
echo "---------STEP 2\n";
17+
18+
foreach ($iterator as $item) {
19+
$iterator->valid();
20+
echo $item->format('Y-m-d') . "\n";
21+
}
22+
23+
$period = new DatePeriod($start, $interval, $end, DatePeriod::EXCLUDE_START_DATE);
24+
$iterator = $period->getIterator();
25+
26+
echo "---------STEP 3\n";
27+
28+
foreach ($iterator as $item) {
29+
echo $item->format('Y-m-d') . "\n";
30+
}
31+
32+
echo "---------STEP 4\n";
33+
34+
foreach ($iterator as $item) {
35+
$iterator->valid();
36+
echo $item->format('Y-m-d') . "\n";
37+
}
38+
?>
39+
--EXPECT--
40+
2022-01-01
41+
2022-01-02
42+
2022-01-03
43+
---------STEP 2
44+
2022-01-01
45+
2022-01-02
46+
2022-01-03
47+
---------STEP 3
48+
2022-01-02
49+
2022-01-03
50+
---------STEP 4
51+
2022-01-02
52+
2022-01-03

0 commit comments

Comments
 (0)