@@ -795,13 +795,24 @@ static zend_string *date_format(const char *format, size_t format_len, timelib_t
795795 case TIMELIB_ZONETYPE_ABBR :
796796 length = slprintf (buffer , sizeof (buffer ), "%s" , offset -> abbr );
797797 break ;
798- case TIMELIB_ZONETYPE_OFFSET :
799- length = slprintf (buffer , sizeof (buffer ), "%c%02d:%02d" ,
800- ((offset -> offset < 0 ) ? '-' : '+' ),
801- abs (offset -> offset / 3600 ),
802- abs ((offset -> offset % 3600 ) / 60 )
803- );
798+ case TIMELIB_ZONETYPE_OFFSET : {
799+ int seconds = offset -> offset % 60 ;
800+ if (seconds == 0 ) {
801+ length = slprintf (buffer , sizeof (buffer ), "%c%02d:%02d" ,
802+ ((offset -> offset < 0 ) ? '-' : '+' ),
803+ abs (offset -> offset / 3600 ),
804+ abs ((offset -> offset % 3600 ) / 60 )
805+ );
806+ } else {
807+ length = slprintf (buffer , sizeof (buffer ), "%c%02d:%02d:%02d" ,
808+ ((offset -> offset < 0 ) ? '-' : '+' ),
809+ abs (offset -> offset / 3600 ),
810+ abs ((offset -> offset % 3600 ) / 60 ),
811+ abs (seconds )
812+ );
813+ }
804814 break ;
815+ }
805816 }
806817 }
807818 break ;
@@ -1930,6 +1941,30 @@ static HashTable *date_object_get_gc_timezone(zend_object *object, zval **table,
19301941 return zend_std_get_properties (object );
19311942} /* }}} */
19321943
1944+ static zend_string * date_create_tz_offset_str (timelib_sll offset )
1945+ {
1946+ int seconds = offset % 60 ;
1947+ size_t size ;
1948+ const char * format ;
1949+ if (seconds == 0 ) {
1950+ size = sizeof ("+05:00" );
1951+ format = "%c%02d:%02d" ;
1952+ } else {
1953+ size = sizeof ("+05:00:01" );
1954+ format = "%c%02d:%02d:%02d" ;
1955+ }
1956+ zend_string * tmpstr = zend_string_alloc (size - 1 , 0 );
1957+
1958+ /* Note: if seconds == 0, the seconds argument will be excessive and therefore ignored. */
1959+ ZSTR_LEN (tmpstr ) = snprintf (ZSTR_VAL (tmpstr ), size , format ,
1960+ offset < 0 ? '-' : '+' ,
1961+ abs ((int )(offset / 3600 )),
1962+ abs ((int )(offset % 3600 ) / 60 ),
1963+ abs (seconds ));
1964+
1965+ return tmpstr ;
1966+ }
1967+
19331968static void date_object_to_hash (php_date_obj * dateobj , HashTable * props )
19341969{
19351970 zval zv ;
@@ -1947,17 +1982,8 @@ static void date_object_to_hash(php_date_obj *dateobj, HashTable *props)
19471982 case TIMELIB_ZONETYPE_ID :
19481983 ZVAL_STRING (& zv , dateobj -> time -> tz_info -> name );
19491984 break ;
1950- case TIMELIB_ZONETYPE_OFFSET : {
1951- zend_string * tmpstr = zend_string_alloc (sizeof ("UTC+05:00" )- 1 , 0 );
1952- int utc_offset = dateobj -> time -> z ;
1953-
1954- ZSTR_LEN (tmpstr ) = snprintf (ZSTR_VAL (tmpstr ), sizeof ("+05:00" ), "%c%02d:%02d" ,
1955- utc_offset < 0 ? '-' : '+' ,
1956- abs (utc_offset / 3600 ),
1957- abs (((utc_offset % 3600 ) / 60 )));
1958-
1959- ZVAL_NEW_STR (& zv , tmpstr );
1960- }
1985+ case TIMELIB_ZONETYPE_OFFSET :
1986+ ZVAL_NEW_STR (& zv , date_create_tz_offset_str (dateobj -> time -> z ));
19611987 break ;
19621988 case TIMELIB_ZONETYPE_ABBR :
19631989 ZVAL_STRING (& zv , dateobj -> time -> tz_abbr );
@@ -2069,29 +2095,8 @@ static void php_timezone_to_string(php_timezone_obj *tzobj, zval *zv)
20692095 case TIMELIB_ZONETYPE_ID :
20702096 ZVAL_STRING (zv , tzobj -> tzi .tz -> name );
20712097 break ;
2072- case TIMELIB_ZONETYPE_OFFSET : {
2073- timelib_sll utc_offset = tzobj -> tzi .utc_offset ;
2074- int seconds = utc_offset % 60 ;
2075- size_t size ;
2076- const char * format ;
2077- if (seconds == 0 ) {
2078- size = sizeof ("+05:00" );
2079- format = "%c%02d:%02d" ;
2080- } else {
2081- size = sizeof ("+05:00:01" );
2082- format = "%c%02d:%02d:%02d" ;
2083- }
2084- zend_string * tmpstr = zend_string_alloc (size - 1 , 0 );
2085-
2086- /* Note: if seconds == 0, the seconds argument will be excessive and therefore ignored. */
2087- ZSTR_LEN (tmpstr ) = snprintf (ZSTR_VAL (tmpstr ), size , format ,
2088- utc_offset < 0 ? '-' : '+' ,
2089- abs ((int )(utc_offset / 3600 )),
2090- abs ((int )(utc_offset % 3600 ) / 60 ),
2091- abs (seconds ));
2092-
2093- ZVAL_NEW_STR (zv , tmpstr );
2094- }
2098+ case TIMELIB_ZONETYPE_OFFSET :
2099+ ZVAL_NEW_STR (zv , date_create_tz_offset_str (tzobj -> tzi .utc_offset ));
20952100 break ;
20962101 case TIMELIB_ZONETYPE_ABBR :
20972102 ZVAL_STRING (zv , tzobj -> tzi .z .abbr );
0 commit comments