@@ -4265,6 +4265,7 @@ PHP_FUNCTION(timezone_transitions_get)
4265
4265
uint64_t begin = 0 ;
4266
4266
bool found ;
4267
4267
zend_long timestamp_begin = ZEND_LONG_MIN , timestamp_end = INT32_MAX ;
4268
+ zend_long last_transition_ts = ZEND_LONG_MIN ;
4268
4269
4269
4270
if (zend_parse_method_parameters (ZEND_NUM_ARGS (), getThis (), "O|ll" , & object , date_ce_timezone , & timestamp_begin , & timestamp_end ) == FAILURE ) {
4270
4271
RETURN_THROWS ();
@@ -4275,13 +4276,13 @@ PHP_FUNCTION(timezone_transitions_get)
4275
4276
RETURN_FALSE ;
4276
4277
}
4277
4278
4278
- #define add_nominal ( ) \
4279
+ #define add_by_index ( i , ts ) \
4279
4280
array_init_size(&element, 5); \
4280
- add_assoc_long(&element, "ts", timestamp_begin ); \
4281
- add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, timestamp_begin , 0)); \
4282
- add_assoc_long(&element, "offset", tzobj->tzi.tz->type[0 ].offset); \
4283
- add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[0 ].isdst); \
4284
- add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[0 ].abbr_idx]); \
4281
+ add_assoc_long(&element, "ts", ts ); \
4282
+ add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts , 0)); \
4283
+ add_assoc_long(&element, "offset", tzobj->tzi.tz->type[i ].offset); \
4284
+ add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[i ].isdst); \
4285
+ add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[i ].abbr_idx]); \
4285
4286
add_next_index_zval(return_value, &element);
4286
4287
4287
4288
#define add (i ,ts ) \
@@ -4293,14 +4294,13 @@ PHP_FUNCTION(timezone_transitions_get)
4293
4294
add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx]); \
4294
4295
add_next_index_zval(return_value, &element);
4295
4296
4296
- #define add_by_index (i ,ts ) \
4297
- array_init_size(& element, 5 ); \
4297
+ #define upd_prev (i ,ts ) \
4298
+ element = *ZEND_HASH_ELEMENT(Z_ARRVAL_P(return_value), Z_ARRVAL_P(return_value)->nNumUsed-1 ); \
4298
4299
add_assoc_long(&element, "ts", ts); \
4299
4300
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);
4301
+ add_assoc_long(&element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset); \
4302
+ add_assoc_bool(&element, "isdst", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].isdst); \
4303
+ add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx]);
4304
4304
4305
4305
#define add_from_tto (to ,ts ) \
4306
4306
array_init_size(&element, 5); \
@@ -4311,6 +4311,7 @@ PHP_FUNCTION(timezone_transitions_get)
4311
4311
add_assoc_string(&element, "abbr", (to)->abbr); \
4312
4312
add_next_index_zval(return_value, &element);
4313
4313
4314
+ #define add_nominal () add_by_index(0, timestamp_begin)
4314
4315
#define add_last () add(tzobj->tzi.tz->bit64.timecnt - 1, timestamp_begin)
4315
4316
4316
4317
array_init (return_value );
@@ -4327,8 +4328,10 @@ PHP_FUNCTION(timezone_transitions_get)
4327
4328
if (tzobj -> tzi .tz -> trans [begin ] > timestamp_begin ) {
4328
4329
if (begin > 0 ) {
4329
4330
add (begin - 1 , timestamp_begin );
4331
+ last_transition_ts = timestamp_begin ;
4330
4332
} else {
4331
4333
add_nominal ();
4334
+ last_transition_ts = timestamp_begin ;
4332
4335
}
4333
4336
found = 1 ;
4334
4337
break ;
@@ -4344,24 +4347,32 @@ PHP_FUNCTION(timezone_transitions_get)
4344
4347
timelib_time_offset * tto = timelib_get_time_zone_info (timestamp_begin , tzobj -> tzi .tz );
4345
4348
add_from_tto (tto , timestamp_begin );
4346
4349
timelib_time_offset_dtor (tto );
4350
+ last_transition_ts = timestamp_begin ;
4347
4351
} else {
4348
4352
add_last ();
4353
+ last_transition_ts = timestamp_begin ;
4349
4354
}
4350
4355
} else {
4351
4356
add_nominal ();
4357
+ last_transition_ts = timestamp_begin ;
4352
4358
}
4353
4359
} else {
4354
4360
for (uint64_t i = begin ; i < tzobj -> tzi .tz -> bit64 .timecnt ; ++ i ) {
4355
- if (tzobj -> tzi .tz -> trans [i ] < timestamp_end ) {
4361
+ if (tzobj -> tzi .tz -> trans [i ] > timestamp_end ) {
4362
+ return ;
4363
+ }
4364
+
4365
+ if (tzobj -> tzi .tz -> trans [i ] > timestamp_begin ) {
4356
4366
add (i , tzobj -> tzi .tz -> trans [i ]);
4367
+ last_transition_ts = tzobj -> tzi .tz -> trans [i ];
4357
4368
} else {
4358
- return ;
4369
+ upd_prev ( i , timestamp_begin ) ;
4359
4370
}
4360
4371
}
4361
4372
}
4373
+
4362
4374
if (tzobj -> tzi .tz -> posix_info && tzobj -> tzi .tz -> posix_info -> dst_end ) {
4363
4375
timelib_sll start_y , end_y , dummy_m , dummy_d ;
4364
- timelib_sll last_transition_ts = tzobj -> tzi .tz -> trans [tzobj -> tzi .tz -> bit64 .timecnt - 1 ];
4365
4376
4366
4377
/* Find out year for last transition */
4367
4378
timelib_unixtime2date (last_transition_ts , & start_y , & dummy_m , & dummy_d );
0 commit comments