@@ -3591,7 +3591,7 @@ PHP_FUNCTION(timezone_transitions_get)
3591
3591
zval * object , element ;
3592
3592
php_timezone_obj * tzobj ;
3593
3593
unsigned int begin = 0 , found ;
3594
- zend_long timestamp_begin = ZEND_LONG_MIN , timestamp_end = ZEND_LONG_MAX ;
3594
+ zend_long timestamp_begin = ZEND_LONG_MIN , timestamp_end = INT32_MAX ;
3595
3595
3596
3596
if (zend_parse_method_parameters (ZEND_NUM_ARGS (), getThis (), "O|ll" , & object , date_ce_timezone , & timestamp_begin , & timestamp_end ) == FAILURE ) {
3597
3597
RETURN_THROWS ();
@@ -3658,6 +3658,35 @@ PHP_FUNCTION(timezone_transitions_get)
3658
3658
for (i = begin ; i < tzobj -> tzi .tz -> bit64 .timecnt ; ++ i ) {
3659
3659
if (tzobj -> tzi .tz -> trans [i ] < timestamp_end ) {
3660
3660
add (i , tzobj -> tzi .tz -> trans [i ]);
3661
+ } else {
3662
+ return ;
3663
+ }
3664
+ }
3665
+ if (tzobj -> tzi .tz -> posix_info && tzobj -> tzi .tz -> posix_info -> dst_end ) {
3666
+ int i , j ;
3667
+ timelib_sll start_y , end_y , dummy_m , dummy_d ;
3668
+ timelib_sll last_transition_ts = tzobj -> tzi .tz -> trans [tzobj -> tzi .tz -> bit64 .timecnt - 1 ];
3669
+
3670
+ /* Find out year for last transition */
3671
+ timelib_unixtime2date (last_transition_ts , & start_y , & dummy_m , & dummy_d );
3672
+
3673
+ /* Find out year for final boundary timestamp */
3674
+ timelib_unixtime2date (timestamp_end , & end_y , & dummy_m , & dummy_d );
3675
+
3676
+ for (i = start_y ; i <= end_y ; i ++ ) {
3677
+ timelib_posix_transitions transitions = { 0 };
3678
+
3679
+ timelib_get_transitions_for_year (tzobj -> tzi .tz , i , & transitions );
3680
+
3681
+ for (j = 0 ; j < transitions .count ; j ++ ) {
3682
+ if (transitions .times [j ] <= last_transition_ts ) {
3683
+ continue ;
3684
+ }
3685
+ if (transitions .times [j ] > timestamp_end ) {
3686
+ return ;
3687
+ }
3688
+ add (transitions .types [j ], transitions .times [j ]);
3689
+ }
3661
3690
}
3662
3691
}
3663
3692
}
0 commit comments