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