Skip to content

Commit 771f930

Browse files
committed
Different approach
1 parent 5042be1 commit 771f930

File tree

2 files changed

+31
-29
lines changed

2 files changed

+31
-29
lines changed

ext/date/php_date.c

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4265,7 +4265,7 @@ PHP_FUNCTION(timezone_transitions_get)
42654265
uint64_t begin = 0;
42664266
bool found;
42674267
zend_long timestamp_begin = ZEND_LONG_MIN, timestamp_end = INT32_MAX;
4268-
zend_long timestamp_added_last = ZEND_LONG_MIN;
4268+
zend_long last_transition_ts = ZEND_LONG_MIN;
42694269

42704270
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|ll", &object, date_ce_timezone, &timestamp_begin, &timestamp_end) == FAILURE) {
42714271
RETURN_THROWS();
@@ -4283,32 +4283,25 @@ PHP_FUNCTION(timezone_transitions_get)
42834283
add_assoc_long(&element, "offset", tzobj->tzi.tz->type[0].offset); \
42844284
add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[0].isdst); \
42854285
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[0].abbr_idx]); \
4286-
add_next_index_zval(return_value, &element); \
4287-
timestamp_added_last = timestamp_begin;
4286+
add_next_index_zval(return_value, &element);
42884287

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

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

43134306
#define add_from_tto(to,ts) \
43144307
array_init_size(&element, 5); \
@@ -4335,8 +4328,10 @@ PHP_FUNCTION(timezone_transitions_get)
43354328
if (tzobj->tzi.tz->trans[begin] > timestamp_begin) {
43364329
if (begin > 0) {
43374330
add(begin - 1, timestamp_begin);
4331+
last_transition_ts = timestamp_begin;
43384332
} else {
43394333
add_nominal();
4334+
last_transition_ts = timestamp_begin;
43404335
}
43414336
found = 1;
43424337
break;
@@ -4352,24 +4347,31 @@ PHP_FUNCTION(timezone_transitions_get)
43524347
timelib_time_offset *tto = timelib_get_time_zone_info(timestamp_begin, tzobj->tzi.tz);
43534348
add_from_tto(tto, timestamp_begin);
43544349
timelib_time_offset_dtor(tto);
4350+
last_transition_ts = timestamp_begin;
43554351
} else {
43564352
add_last();
4353+
last_transition_ts = timestamp_begin;
43574354
}
43584355
} else {
43594356
add_nominal();
4357+
last_transition_ts = timestamp_begin;
43604358
}
43614359
} else {
43624360
for (uint64_t i = begin; i < tzobj->tzi.tz->bit64.timecnt; ++i) {
4363-
if (tzobj->tzi.tz->trans[i] < timestamp_end) {
4364-
add(i, tzobj->tzi.tz->trans[i]);
4365-
} else {
4361+
if (tzobj->tzi.tz->trans[i] > timestamp_end) {
43664362
return;
43674363
}
4364+
4365+
if (tzobj->tzi.tz->trans[i] > timestamp_begin) {
4366+
add(i, tzobj->tzi.tz->trans[i]);
4367+
}
43684368
}
4369+
4370+
last_transition_ts = tzobj->tzi.tz->trans[tzobj->tzi.tz->bit64.timecnt - 1];
43694371
}
4372+
43704373
if (tzobj->tzi.tz->posix_info && tzobj->tzi.tz->posix_info->dst_end) {
43714374
timelib_sll start_y, end_y, dummy_m, dummy_d;
4372-
timelib_sll last_transition_ts = tzobj->tzi.tz->trans[tzobj->tzi.tz->bit64.timecnt - 1];
43734375

43744376
/* Find out year for last transition */
43754377
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)