@@ -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 );
0 commit comments