Skip to content

Commit 99c4426

Browse files
committed
Different approach
1 parent 18350af commit 99c4426

File tree

2 files changed

+38
-39
lines changed

2 files changed

+38
-39
lines changed

ext/date/php_date.c

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4264,7 +4264,7 @@ PHP_FUNCTION(timezone_transitions_get)
42644264
uint64_t begin = 0;
42654265
bool found;
42664266
zend_long timestamp_begin = ZEND_LONG_MIN, timestamp_end = INT32_MAX;
4267-
zend_long timestamp_added_last = ZEND_LONG_MIN;
4267+
zend_long last_transition_ts = ZEND_LONG_MIN;
42684268

42694269
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|ll", &object, date_ce_timezone, &timestamp_begin, &timestamp_end) == FAILURE) {
42704270
RETURN_THROWS();
@@ -4282,44 +4282,34 @@ PHP_FUNCTION(timezone_transitions_get)
42824282
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[0].offset); \
42834283
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[0].isdst); \
42844284
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[0].abbr_idx]); \
4285-
add_next_index_zval(return_value, &element); \
4286-
timestamp_added_last = timestamp_begin;
4285+
add_next_index_zval(return_value, &element);
42874286

42884287
#define add(i,ts) \
4289-
if (ts > timestamp_added_last) { \
4290-
array_init(&element); \
4291-
add_assoc_long(&element, "ts", ts); \
4292-
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \
4293-
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset); \
4294-
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].isdst); \
4295-
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx]); \
4296-
add_next_index_zval(return_value, &element); \
4297-
timestamp_added_last = ts; \
4298-
}
4288+
array_init(&element); \
4289+
add_assoc_long(&element, "ts", ts); \
4290+
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \
4291+
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset); \
4292+
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].isdst); \
4293+
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx]); \
4294+
add_next_index_zval(return_value, &element);
42994295

43004296
#define add_by_index(i,ts) \
4301-
if (ts > timestamp_added_last) { \
4302-
array_init(&element); \
4303-
add_assoc_long(&element, "ts", ts); \
4304-
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \
4305-
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[i].offset); \
4306-
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[i].isdst); \
4307-
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[i].abbr_idx]); \
4308-
add_next_index_zval(return_value, &element); \
4309-
timestamp_added_last = ts; \
4310-
}
4297+
array_init(&element); \
4298+
add_assoc_long(&element, "ts", ts); \
4299+
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \
4300+
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[i].offset); \
4301+
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[i].isdst); \
4302+
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[i].abbr_idx]); \
4303+
add_next_index_zval(return_value, &element);
43114304

43124305
#define add_from_tto(to,ts) \
4313-
if (ts > timestamp_added_last) { \
4314-
array_init(&element); \
4315-
add_assoc_long(&element, "ts", ts); \
4316-
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \
4317-
add_assoc_long(&element, "offset", (to)->offset); \
4318-
add_assoc_bool(&element, "isdst", (to)->is_dst); \
4319-
add_assoc_string(&element, "abbr", (to)->abbr); \
4320-
add_next_index_zval(return_value, &element); \
4321-
timestamp_added_last = ts; \
4322-
}
4306+
array_init(&element); \
4307+
add_assoc_long(&element, "ts", ts); \
4308+
add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \
4309+
add_assoc_long(&element, "offset", (to)->offset); \
4310+
add_assoc_bool(&element, "isdst", (to)->is_dst); \
4311+
add_assoc_string(&element, "abbr", (to)->abbr); \
4312+
add_next_index_zval(return_value, &element);
43234313

43244314
#define add_last() add(tzobj->tzi.tz->bit64.timecnt - 1, timestamp_begin)
43254315

@@ -4337,8 +4327,10 @@ PHP_FUNCTION(timezone_transitions_get)
43374327
if (tzobj->tzi.tz->trans[begin] > timestamp_begin) {
43384328
if (begin > 0) {
43394329
add(begin - 1, timestamp_begin);
4330+
last_transition_ts = timestamp_begin;
43404331
} else {
43414332
add_nominal();
4333+
last_transition_ts = timestamp_begin;
43424334
}
43434335
found = 1;
43444336
break;
@@ -4354,24 +4346,31 @@ PHP_FUNCTION(timezone_transitions_get)
43544346
timelib_time_offset *tto = timelib_get_time_zone_info(timestamp_begin, tzobj->tzi.tz);
43554347
add_from_tto(tto, timestamp_begin);
43564348
timelib_time_offset_dtor(tto);
4349+
last_transition_ts = timestamp_begin;
43574350
} else {
43584351
add_last();
4352+
last_transition_ts = timestamp_begin;
43594353
}
43604354
} else {
43614355
add_nominal();
4356+
last_transition_ts = timestamp_begin;
43624357
}
43634358
} else {
43644359
for (uint64_t i = begin; i < tzobj->tzi.tz->bit64.timecnt; ++i) {
4365-
if (tzobj->tzi.tz->trans[i] < timestamp_end) {
4366-
add(i, tzobj->tzi.tz->trans[i]);
4367-
} else {
4360+
if (tzobj->tzi.tz->trans[i] > timestamp_end) {
43684361
return;
43694362
}
4363+
4364+
if (tzobj->tzi.tz->trans[i] > timestamp_begin) {
4365+
add(i, tzobj->tzi.tz->trans[i]);
4366+
}
43704367
}
4368+
4369+
last_transition_ts = tzobj->tzi.tz->trans[tzobj->tzi.tz->bit64.timecnt - 1];
43714370
}
4371+
43724372
if (tzobj->tzi.tz->posix_info && tzobj->tzi.tz->posix_info->dst_end) {
43734373
timelib_sll start_y, end_y, dummy_m, dummy_d;
4374-
timelib_sll last_transition_ts = tzobj->tzi.tz->trans[tzobj->tzi.tz->bit64.timecnt - 1];
43754374

43764375
/* Find out year for last transition */
43774376
timelib_unixtime2date(last_transition_ts, &start_y, &dummy_m, &dummy_d);

ext/date/tests/bug80963.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ array(5) {
2727
["abbr"]=>
2828
string(3) "GMT"
2929
}
30-
int(237)
30+
int(23%d)
3131
array(5) {
3232
["ts"]=>
3333
int(2140668000)
@@ -40,7 +40,7 @@ array(5) {
4040
["abbr"]=>
4141
string(3) "EST"
4242
}
43-
int(144)
43+
int(14%d)
4444
array(5) {
4545
["ts"]=>
4646
int(2140045200)

0 commit comments

Comments
 (0)