]> granicus.if.org Git - php/commitdiff
- MFH Bugfixes:
authorDerick Rethans <derick@php.net>
Sat, 26 Jan 2008 16:26:47 +0000 (16:26 +0000)
committerDerick Rethans <derick@php.net>
Sat, 26 Jan 2008 16:26:47 +0000 (16:26 +0000)
- Fixed bug #43808 (date_create never fails (even when it should)).
- Fixed bug #43527 (DateTime created from a timestamp reports environment
  timezone).
- Fixed bug #43003 (Invalid timezone reported for DateTime objects
  constructed using a timestamp).
- Fixed bug #42190 (Constructing DateTime with TimeZone Indicator
  invalidates DateTimeZone).
- Fixed bug #41599 (setTime() fails after modify() is used).

NEWS
ext/date/lib/parse_date.c
ext/date/lib/tm2unixtime.c
ext/date/php_date.c
ext/date/tests/bug40743.phpt [new file with mode: 0644]
ext/date/tests/bug41599.phpt [new file with mode: 0644]
ext/date/tests/bug42910.phpt [new file with mode: 0644]
ext/date/tests/bug43003.phpt [new file with mode: 0644]
ext/date/tests/bug43527.phpt [new file with mode: 0644]
ext/date/tests/bug43808.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 44fd654115175a17446ae199db01170a17c7cf7f..178722681c8eaa5e27f70869800c74f5b1b88433 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,7 @@ PHP                                                                        NEWS
   in mysql_connect()). (Hannes)
 - Fixed bug #43863 (str_word_count() breaks on cyrillic "ya" in locale cp1251).
   (phprus at gmail dot com, Tony)
+- Fixed bug #43808 (date_create never fails (even when it should)). (Derick)
 - Fixed bug #43793 (zlib filter is unable to auto-detect gzip/zlib file headers).
   (Greg)
 - Fixed bug #43703 (Signature compatibility check broken). (Dmitry)
@@ -32,6 +33,8 @@ PHP                                                                        NEWS
 - Fixed bug #43580 (removed bogus declaration of a non-existent php_is_url()  
   function). (Ilia)
 - Fixed bug #43533 (escapeshellarg('') returns null). (Ilia)
+- Fixed bug #43527 (DateTime created from a timestamp reports environment
+  timezone). (Derick)
 - Fixed bug #43522 (stream_get_line() eats additional characters). (Felipe,
   Ilia, Tony)
 - Fixed bug #43497 (OCI8 XML/getClobVal aka temporary LOBs leak UGA memory).
@@ -57,6 +60,8 @@ PHP                                                                        NEWS
   (Jani)
 - Fixed bug #43301 (mb_ereg*_replace() crashes when replacement string is
   invalid PHP expression and 'e' option is used). (Jani)
+- Fixed bug #43003 (Invalid timezone reported for DateTime objects constructed
+  using a timestamp). (Derick)
 - Fixed bug #43295 (crash because of uninitialized SG(sapi_headers).mimetype). 
   (Dmitry)
 - Fixed bug #43293 (Multiple segfaults in getopt()). (Hannes)
@@ -87,6 +92,9 @@ PHP                                                                        NEWS
 - Fixed bug #42272 (var_export() incorrectly escapes char(0)). (Derick)
 - Fixed bug #42261 (Incorrect lengths for date and boolean data types).
   (Ilia)
+- Fixed bug #42190 (Constructing DateTime with TimeZone Indicator invalidates
+  DateTimeZone). (Derick)
+- Fixed bug #41599 (setTime() fails after modify() is used). (Derick)
 - Fixed bug #38468 (Unexpected creation of cycle). (Dmitry)
 
 08 Nov 2007, PHP 5.2.5
index 45c3df331a960e578bed1ccc8d11c346db84cf45..ef95b1903c6cb6dea45095085f7cacffe8725051 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.12.1 on Thu Jul 12 19:32:22 2007 */
+/* Generated by re2c 0.12.1 on Sat Jan 26 16:10:48 2008 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
    +----------------------------------------------------------------------+
index 3a7fd2447876692ec88e77f03448b8a8065ed34b..4bd1f8f576cfcef183c8ceed5ececaed4006a6ae 100644 (file)
@@ -98,6 +98,7 @@ static void do_adjust_for_weekday(timelib_time* time)
        } else {
                time->d -= (7 - (abs(time->relative.weekday) - current_dow));
        }
+       time->have_weekday_relative = 0;
 }
 
 static void do_normalize(timelib_time* time)
@@ -130,6 +131,7 @@ static void do_adjust_relative(timelib_time* time)
        do_normalize(time);
 
        memset(&(time->relative), 0, sizeof(time->relative));
+       time->have_relative = 0;
 }
 
 static void do_adjust_special_weekday(timelib_time* time)
index abf5d7e90c3c9f4ae6669882f0549d92b1d97e79..9b05540d16229545f438688fbbe7dfe5e26d7ffd 100644 (file)
@@ -266,7 +266,18 @@ struct _php_date_obj {
 
 struct _php_timezone_obj {
        zend_object     std;
-       timelib_tzinfo *tz;
+       int             initialized;
+       int             type;
+       union {
+               timelib_tzinfo *tz; // TIMELIB_ZONETYPE_ID;
+               timelib_sll     utc_offset; // TIMELIB_ZONETYPE_OFFSET
+               struct                      // TIMELIB_ZONETYPE_ABBR
+               {
+                       timelib_sll  utc_offset;
+                       char        *abbr;
+                       int          dst;
+               } z;
+       } tzi;
 };
 
 #define DATE_SET_CONTEXT \
@@ -808,7 +819,26 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca
                                                          );
                                          break;
                        case 'T': length = slprintf(buffer, 32, "%s", localtime ? offset->abbr : "GMT"); break;
-                       case 'e': length = slprintf(buffer, 32, "%s", localtime ? t->tz_info->name : "UTC"); break;
+                       case 'e': if (!localtime) {
+                                             length = slprintf(buffer, 32, "%s", "UTC");
+                                         } else {
+                                                 switch (t->zone_type) {
+                                                         case TIMELIB_ZONETYPE_ID:
+                                                                 length = slprintf(buffer, 32, "%s", t->tz_info->name);
+                                                                 break;
+                                                         case TIMELIB_ZONETYPE_ABBR:
+                                                                 length = slprintf(buffer, 32, "%s", offset->abbr);
+                                                                 break;
+                                                         case TIMELIB_ZONETYPE_OFFSET:
+                                                                 length = slprintf(buffer, 32, "%c%02d:%02d",
+                                                                                               ((offset->offset < 0) ? '-' : '+'),
+                                                                                               abs(offset->offset / 3600),
+                                                                                               abs((offset->offset % 3600) / 60)
+                                                                                  );
+                                                                 break;
+                                                 }
+                                         }
+                                         break;
                        case 'Z': length = slprintf(buffer, 32, "%d", localtime ? offset->offset : 0); break;
 
                        /* full date/time */
@@ -1086,7 +1116,7 @@ PHP_FUNCTION(strtotime)
                now = timelib_time_ctor();
 
                initial_ts = emalloc(25);
-               snprintf(initial_ts, 24, "@%ld", preset_ts);
+               snprintf(initial_ts, 24, "@%ld UTC", preset_ts);
                t = timelib_strtotime(initial_ts, strlen(initial_ts), NULL, DATE_TIMEZONEDB); /* we ignore the error here, as this should never fail */
                timelib_update_ts(t, tzi);
                now->tz_info = tzi;
@@ -1590,7 +1620,21 @@ static zend_object_value date_object_clone_timezone(zval *this_ptr TSRMLS_DC)
        zend_object_value new_ov = date_object_new_timezone_ex(old_obj->std.ce, &new_obj TSRMLS_CC);
        
        zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC);
-       new_obj->tz = old_obj->tz;
+       new_obj->type = old_obj->type;
+       new_obj->initialized = 1;
+       switch (new_obj->type) {
+               case TIMELIB_ZONETYPE_ID:
+                       new_obj->tzi.tz = old_obj->tzi.tz;
+                       break;
+               case TIMELIB_ZONETYPE_OFFSET:
+                       new_obj->tzi.utc_offset = old_obj->tzi.utc_offset;
+                       break;
+               case TIMELIB_ZONETYPE_ABBR:
+                       new_obj->tzi.z.utc_offset = old_obj->tzi.z.utc_offset;
+                       new_obj->tzi.z.dst        = old_obj->tzi.z.dst;
+                       new_obj->tzi.z.abbr       = old_obj->tzi.z.abbr;
+                       break;
+       }
        
        return new_ov;
 }
@@ -1614,6 +1658,9 @@ static void date_object_free_storage_timezone(void *object TSRMLS_DC)
 {
        php_timezone_obj *intern = (php_timezone_obj *)object;
 
+       if (intern->type == TIMELIB_ZONETYPE_ABBR) {
+               free(intern->tzi.z.abbr);
+       }
        zend_object_std_dtor(&intern->std TSRMLS_CC);
        efree(object);
 }
@@ -1632,12 +1679,14 @@ static zval * date_instantiate(zend_class_entry *pce, zval *object TSRMLS_DC)
        return object;
 }
 
-static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int time_str_len, zval *timezone_object TSRMLS_DC)
+static int date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int time_str_len, zval *timezone_object, int ctor TSRMLS_DC)
 {
        timelib_time   *now;
        timelib_tzinfo *tzi;
        timelib_error_container *err = NULL;
-       int free_tzi = 0;
+       int free_tzi = 0, type = TIMELIB_ZONETYPE_ID, new_dst;
+       char *new_abbr;
+       timelib_sll     new_offset;
        
        if (dateobj->time) {
                if (dateobj->time->tz_info) {
@@ -1647,7 +1696,7 @@ static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
        }
        dateobj->time = timelib_strtotime(time_str_len ? time_str : "now", time_str_len ? time_str_len : sizeof("now") -1, &err, DATE_TIMEZONEDB);
        if (err) {
-               if (err->error_count) {
+               if (ctor && err && err->error_count) {
                        /* spit out the first library error message, at least */
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", time_str,
                                                        err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
@@ -1655,12 +1704,35 @@ static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
                timelib_error_container_dtor(err);
        }
 
+
+       if (ctor && err && err->error_count) {
+               /* spit out the first library error message, at least */
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", time_str,
+                       err->error_messages[0].position, err->error_messages[0].character, err->error_messages[0].message);
+       }
+       if (err && err->error_count) {
+               return 0;
+       }
+
        if (timezone_object) {
                php_timezone_obj *tzobj;
 
                tzobj = (php_timezone_obj *) zend_object_store_get_object(timezone_object TSRMLS_CC);
-               tzi = timelib_tzinfo_clone(tzobj->tz);
-               free_tzi = 1;
+               switch (tzobj->type) {
+                       case TIMELIB_ZONETYPE_ID:
+                               tzi = timelib_tzinfo_clone(tzobj->tzi.tz);
+                               free_tzi = 1;
+                               break;
+                       case TIMELIB_ZONETYPE_OFFSET:
+                               new_offset = tzobj->tzi.utc_offset;
+                               break;
+                       case TIMELIB_ZONETYPE_ABBR:
+                               new_offset = tzobj->tzi.z.utc_offset;
+                               new_dst    = tzobj->tzi.z.dst;
+                               new_abbr   = strdup(tzobj->tzi.z.abbr);
+                               break;
+               }
+               type = tzobj->type;
        } else if (dateobj->time->tz_info) {
                tzi = timelib_tzinfo_clone(dateobj->time->tz_info);
                free_tzi = 1;
@@ -1669,8 +1741,20 @@ static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
        }
 
        now = timelib_time_ctor();
-       now->tz_info = tzi;
-       now->zone_type = TIMELIB_ZONETYPE_ID;
+       now->zone_type = type;
+       switch (type) {
+               case TIMELIB_ZONETYPE_ID:
+                       now->tz_info = tzi;
+                       break;
+               case TIMELIB_ZONETYPE_OFFSET:
+                       now->z = new_offset;
+                       break;
+               case TIMELIB_ZONETYPE_ABBR:
+                       now->z = new_offset;
+                       now->dst = new_dst;
+                       now->tz_abbr = new_abbr;
+                       break;
+       }
        timelib_unixtime2local(now, (timelib_sll) time(NULL));
 
        timelib_fill_holes(dateobj->time, now, 0);
@@ -1678,13 +1762,15 @@ static void date_initialize(php_date_obj *dateobj, /*const*/ char *time_str, int
 
        dateobj->time->have_weekday_relative = dateobj->time->have_relative = 0;
 
-       if (now->tz_info != tzi) {
+       if (type == TIMELIB_ZONETYPE_ID && now->tz_info != tzi) {
                timelib_tzinfo_dtor(now->tz_info);
        }
        if (free_tzi) {
                timelib_tzinfo_dtor(tzi);
        }
-       timelib_time_dtor(now); 
+       timelib_time_dtor(now);
+
+       return 1;
 }
 
 /* {{{ proto DateTime date_create([string time[, DateTimeZone object]])
@@ -1701,7 +1787,9 @@ PHP_FUNCTION(date_create)
        }
 
        date_instantiate(date_ce_date, return_value TSRMLS_CC);
-       date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, timezone_object TSRMLS_CC);
+       if (!date_initialize(zend_object_store_get_object(return_value TSRMLS_CC), time_str, time_str_len, timezone_object, 0 TSRMLS_CC)) {
+               RETURN_FALSE;
+       }
 }
 /* }}} */
 
@@ -1716,7 +1804,7 @@ PHP_METHOD(DateTime, __construct)
        
        php_set_error_handling(EH_THROW, NULL TSRMLS_CC);
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sO", &time_str, &time_str_len, &timezone_object, date_ce_timezone)) {
-               date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, timezone_object TSRMLS_CC);
+               date_initialize(zend_object_store_get_object(getThis() TSRMLS_CC), time_str, time_str_len, timezone_object, 1 TSRMLS_CC);
        }
        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
 }
@@ -1889,10 +1977,24 @@ PHP_FUNCTION(date_timezone_get)
        }
        dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
        DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
-       if (dateobj->time->is_localtime && dateobj->time->tz_info) {
+       if (dateobj->time->is_localtime/* && dateobj->time->tz_info*/) {
                date_instantiate(date_ce_timezone, return_value TSRMLS_CC);
                tzobj = (php_timezone_obj *) zend_object_store_get_object(return_value TSRMLS_CC);
-               tzobj->tz = timelib_tzinfo_clone(dateobj->time->tz_info);
+               tzobj->initialized = 1;
+               tzobj->type = dateobj->time->zone_type;
+               switch (dateobj->time->zone_type) {
+                       case TIMELIB_ZONETYPE_ID:
+                               tzobj->tzi.tz = dateobj->time->tz_info;
+                               break;
+                       case TIMELIB_ZONETYPE_OFFSET:
+                               tzobj->tzi.utc_offset = dateobj->time->z;
+                               break;
+                       case TIMELIB_ZONETYPE_ABBR:
+                               tzobj->tzi.z.utc_offset = dateobj->time->z;
+                               tzobj->tzi.z.dst = dateobj->time->dst;
+                               tzobj->tzi.z.abbr = strdup(dateobj->time->tz_abbr);
+                               break;
+               }
        } else {
                RETURN_FALSE;
        }
@@ -1915,10 +2017,13 @@ PHP_FUNCTION(date_timezone_set)
        dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
        DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
        tzobj = (php_timezone_obj *) zend_object_store_get_object(timezone_object TSRMLS_CC);
+       if (tzobj->type != TIMELIB_ZONETYPE_ID) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can only do this for zones with ID for now");
+       }
        if (dateobj->time->tz_info) {
                timelib_tzinfo_dtor(dateobj->time->tz_info);
        }
-       timelib_set_timezone(dateobj->time, timelib_tzinfo_clone(tzobj->tz));
+       timelib_set_timezone(dateobj->time, timelib_tzinfo_clone(tzobj->tzi.tz));
        timelib_unixtime2local(dateobj->time, dateobj->time->sse);
 }
 /* }}} */
@@ -1937,10 +2042,20 @@ PHP_FUNCTION(date_offset_get)
        }
        dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
        DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
-       if (dateobj->time->is_localtime && dateobj->time->tz_info) {
-               offset = timelib_get_time_zone_info(dateobj->time->sse, dateobj->time->tz_info);
-               RETVAL_LONG(offset->offset);
-               timelib_time_offset_dtor(offset);
+       if (dateobj->time->is_localtime/* && dateobj->time->tz_info*/) {
+               switch (dateobj->time->zone_type) {
+                       case TIMELIB_ZONETYPE_ID:
+                               offset = timelib_get_time_zone_info(dateobj->time->sse, dateobj->time->tz_info);
+                               RETVAL_LONG(offset->offset);
+                               timelib_time_offset_dtor(offset);
+                               break;
+                       case TIMELIB_ZONETYPE_OFFSET:
+                               RETVAL_LONG(dateobj->time->z * -60);
+                               break;
+                       case TIMELIB_ZONETYPE_ABBR:
+                               RETVAL_LONG((dateobj->time->z - (60 * dateobj->time->dst)) * -60);
+                               break;
+               }
                return;
        } else {
                RETURN_LONG(0);
@@ -2042,6 +2157,7 @@ PHP_FUNCTION(timezone_open)
        char *tz;
        int   tz_len;
        timelib_tzinfo *tzi = NULL;
+       php_timezone_obj *tzobj;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &tz, &tz_len) == FAILURE) {
                RETURN_FALSE;
@@ -2049,7 +2165,9 @@ PHP_FUNCTION(timezone_open)
        if (SUCCESS != timezone_initialize(&tzi, tz TSRMLS_CC)) {
                RETURN_FALSE;
        }
-       ((php_timezone_obj *) zend_object_store_get_object(date_instantiate(date_ce_timezone, return_value TSRMLS_CC) TSRMLS_CC))->tz = tzi;
+       tzobj = zend_object_store_get_object(date_instantiate(date_ce_timezone, return_value TSRMLS_CC) TSRMLS_CC);
+       tzobj->type = TIMELIB_ZONETYPE_ID;
+       tzobj->tzi.tz = tzi;
 }
 /* }}} */
 
@@ -2061,11 +2179,15 @@ PHP_METHOD(DateTimeZone, __construct)
        char *tz;
        int tz_len;
        timelib_tzinfo *tzi = NULL;
+       php_timezone_obj *tzobj;
        
        php_set_error_handling(EH_THROW, NULL TSRMLS_CC);
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &tz, &tz_len)) {
                if (SUCCESS == timezone_initialize(&tzi, tz TSRMLS_CC)) {
-                       ((php_timezone_obj *) zend_object_store_get_object(getThis() TSRMLS_CC))->tz = tzi;
+                       tzobj = zend_object_store_get_object(getThis() TSRMLS_CC);
+                       tzobj->type = TIMELIB_ZONETYPE_ID;
+                       tzobj->tzi.tz = tzi;
+                       tzobj->initialized = 1;
                } else {
                        ZVAL_NULL(getThis());
                }
@@ -2086,9 +2208,28 @@ PHP_FUNCTION(timezone_name_get)
                RETURN_FALSE;
        }
        tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       DATE_CHECK_INITIALIZED(tzobj->tz, DateTimeZone);
+       DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
+
+       switch (tzobj->type) {
+               case TIMELIB_ZONETYPE_ID:
+                       RETURN_STRING(tzobj->tzi.tz->name, 1);
+                       break;
+               case TIMELIB_ZONETYPE_OFFSET: {
+                       char *tmpstr = emalloc(sizeof("UTC+05:00"));
+                       timelib_sll utc_offset = tzobj->tzi.utc_offset;
+
+                       snprintf(tmpstr, sizeof("+05:00"), "%c%02d:%02d",
+                               utc_offset > 0 ? '-' : '+',
+                               abs(utc_offset / 60),
+                               abs((utc_offset % 60)));
 
-       RETURN_STRING(tzobj->tz->name, 1);
+                       RETURN_STRING(tmpstr, 0);
+                       }
+                       break;
+               case TIMELIB_ZONETYPE_ABBR:
+                       RETURN_STRING(tzobj->tzi.z.abbr, 1);
+                       break;
+       }
 }
 /* }}} */
 
@@ -2130,11 +2271,11 @@ PHP_FUNCTION(timezone_offset_get)
                RETURN_FALSE;
        }
        tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       DATE_CHECK_INITIALIZED(tzobj->tz, DateTimeZone);
+       DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
        dateobj = (php_date_obj *) zend_object_store_get_object(dateobject TSRMLS_CC);
        DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
 
-       offset = timelib_get_time_zone_info(dateobj->time->sse, tzobj->tz);
+       offset = timelib_get_time_zone_info(dateobj->time->sse, tzobj->tzi.tz);
        RETVAL_LONG(offset->offset);
        timelib_time_offset_dtor(offset);
 }
@@ -2153,17 +2294,20 @@ PHP_FUNCTION(timezone_transitions_get)
                RETURN_FALSE;
        }
        tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       DATE_CHECK_INITIALIZED(tzobj->tz, DateTimeZone);
+       DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
+       if (tzobj->type != TIMELIB_ZONETYPE_ID) {
+               RETURN_FALSE;
+       }
 
        array_init(return_value);
-       for (i = 0; i < tzobj->tz->timecnt; ++i) {
+       for (i = 0; i < tzobj->tzi.tz->timecnt; ++i) {
                MAKE_STD_ZVAL(element);
                array_init(element);
-               add_assoc_long(element, "ts",     tzobj->tz->trans[i]);
-               add_assoc_string(element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, tzobj->tz->trans[i], 0 TSRMLS_CC), 0);
-               add_assoc_long(element, "offset", tzobj->tz->type[tzobj->tz->trans_idx[i]].offset);
-               add_assoc_bool(element, "isdst",  tzobj->tz->type[tzobj->tz->trans_idx[i]].isdst);
-               add_assoc_string(element, "abbr", &tzobj->tz->timezone_abbr[tzobj->tz->type[tzobj->tz->trans_idx[i]].abbr_idx], 1);
+               add_assoc_long(element, "ts",     tzobj->tzi.tz->trans[i]);
+               add_assoc_string(element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, tzobj->tzi.tz->trans[i], 0 TSRMLS_CC), 0);
+               add_assoc_long(element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset);
+               add_assoc_bool(element, "isdst",  tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].isdst);
+               add_assoc_string(element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx], 1);
 
                add_next_index_zval(return_value, element);
        }
diff --git a/ext/date/tests/bug40743.phpt b/ext/date/tests/bug40743.phpt
new file mode 100644 (file)
index 0000000..f3ce171
--- /dev/null
@@ -0,0 +1,40 @@
+--TEST--
+Bug #40743 (DateTime ignores the TimeZone object passed to the constructor)
+--FILE--
+<?php
+$dt = new DateTime('@1200506699', new DateTimeZone('Europe/Berlin'));
+echo $dt->format(DATE_RFC822), "\n";
+echo $dt->format('T e Z'), "\n";
+echo "-----\n";
+
+date_default_timezone_set('America/New_York');
+
+$dt = new DateTime('16 Jan 08 13:04:59');
+echo $dt->format(DATE_RFC822 . " e T O U"), "\n";
+
+$dt = new DateTime('@1200506699');
+echo $dt->format(DATE_RFC822 . " e T O U"), "\n";
+
+$dt = new DateTime('@1200506699');
+$dt->setTimezone( new DateTimeZone( 'America/New_York' ) );
+echo $dt->format(DATE_RFC822 . " e T O U"), "\n";
+
+$dt = new DateTime('@1200506699', new DateTimeZone('Europe/Berlin'));
+echo $dt->format(DATE_RFC822 . " e T O U"), "\n";
+
+$dt = new DateTime('16 Jan 08 13:04:59 America/Chicago');
+echo $dt->format(DATE_RFC822 . " e T O U"), "\n";
+
+$dt = new DateTime('16 Jan 08 13:04:59 America/Chicago', new DateTimeZone('Europe/Berlin'));
+echo $dt->format(DATE_RFC822 . " e T O U"), "\n";
+?>
+--EXPECT--
+Wed, 16 Jan 08 18:04:59 +0000
+GMT+0000 +00:00 0
+-----
+Wed, 16 Jan 08 13:04:59 -0500 America/New_York EST -0500 1200506699
+Wed, 16 Jan 08 18:04:59 +0000 +00:00 GMT+0000 +0000 1200506699
+Wed, 16 Jan 08 13:04:59 -0500 America/New_York EST -0500 1200506699
+Wed, 16 Jan 08 18:04:59 +0000 +00:00 GMT+0000 +0000 1200506699
+Wed, 16 Jan 08 13:04:59 -0600 America/Chicago CST -0600 1200510299
+Wed, 16 Jan 08 13:04:59 -0600 America/Chicago CST -0600 1200510299
diff --git a/ext/date/tests/bug41599.phpt b/ext/date/tests/bug41599.phpt
new file mode 100644 (file)
index 0000000..e4febe2
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Bug #41599 (setTime() fails after modify() is used)
+--FILE--
+<?php
+date_default_timezone_set('Europe/London');
+
+$start = new DateTime('2008-01-17 last Monday');
+echo $start->format('Y-m-d H:i:s'),PHP_EOL;
+//good
+
+$start->modify('Tuesday');
+echo $start->format('Y-m-d H:i:s'),PHP_EOL;
+//good
+
+$start->setTime(4, 0, 0);
+echo $start->format('Y-m-d H:i:s'),PHP_EOL;
+//jumped to next Sunday
+
+$start->setTime(8, 0, 0);
+echo $start->format('Y-m-d H:i:s'),PHP_EOL;
+//jumped to next Sunday again
+?>
+--EXPECT--
+2008-01-14 00:00:00
+2008-01-15 00:00:00
+2008-01-15 04:00:00
+2008-01-15 08:00:00
diff --git a/ext/date/tests/bug42910.phpt b/ext/date/tests/bug42910.phpt
new file mode 100644 (file)
index 0000000..1bd0790
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+Bug #42910 (Constructing DateTime with TimeZone Indicator invalidates DateTimeZone)
+--FILE--
+<?php
+       date_default_timezone_set('America/Los_Angeles');
+       $foo = new DateTime('2007-03-11');
+       $bar = new DateTime('2007-03-11T00:00:00-0800');
+
+       print $foo->format(DateTime::ISO8601) . ' - ' .  $foo->getTimezone()->getName() . ' - ' . $foo->format('U') . "\r\n";
+       print $bar->format(DateTime::ISO8601) . ' - ' .  $bar->getTimezone()->getName() . ' - ' . $bar->format('U') . "\r\n";
+
+       $foo->setDate(2007, 03, 12);
+       $bar->setDate(2007, 03, 12);
+
+       print $foo->format(DateTime::ISO8601) . ' - ' .  $foo->getTimezone()->getName() . ' - ' . $foo->format('U') . "\r\n";
+       print $bar->format(DateTime::ISO8601) . ' - ' .  $bar->getTimezone()->getName() . ' - ' . $bar->format('U') . "\r\n";
+
+// --------------
+
+    date_default_timezone_set('Australia/Sydney');
+  
+    $date= date_create('2007-11-04 12:00:00+0200');
+    var_dump(date_format($date, 'O e'));
+?>
+--EXPECT--
+2007-03-11T00:00:00-0800 - America/Los_Angeles - 1173600000
+2007-03-11T00:00:00-0800 - -08:00 - 1173600000
+2007-03-12T00:00:00-0700 - America/Los_Angeles - 1173682800
+2007-03-12T00:00:00-0800 - -08:00 - 1173686400
+string(12) "+0200 +02:00"
diff --git a/ext/date/tests/bug43003.phpt b/ext/date/tests/bug43003.phpt
new file mode 100644 (file)
index 0000000..3192d55
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #43003 (Invalid timezone reported for DateTime objects constructed using a timestamp)
+--FILE--
+<?php
+$oDateTest = new DateTime("@0", new DateTimeZone(date_default_timezone_get()));
+echo $oDateTest->getTimezone()->getName().": " .  $oDateTest->format("Y-m-d H:i:s")."\n";
+
+$oDateTest->setTimezone(new DateTimeZone("UTC"));
+echo $oDateTest->getTimezone()->getName().": " .  $oDateTest->format("Y-m-d H:i:s")."\n";
+
+$oDateTest->setTimezone(new DateTimeZone(date_default_timezone_get()));
+echo $oDateTest->getTimezone()->getName().": " . $oDateTest->format("Y-m-d H:i:s")."\n";
+
+$oDateTest = new DateTime("@0");
+echo $oDateTest->getTimezone()->getName().": " .  $oDateTest->format("Y-m-d H:i:s")."\n";
+
+$oDateTest->setTimezone( new DateTimeZone(date_default_timezone_get()));
+echo $oDateTest->getTimezone()->getName().": " . $oDateTest->format("Y-m-d H:i:s")."\n";
+?>
+--EXPECT--
++00:00: 1970-01-01 00:00:00
+UTC: 1970-01-01 00:00:00
+Europe/Oslo: 1970-01-01 01:00:00
++00:00: 1970-01-01 00:00:00
+Europe/Oslo: 1970-01-01 01:00:00
diff --git a/ext/date/tests/bug43527.phpt b/ext/date/tests/bug43527.phpt
new file mode 100644 (file)
index 0000000..cc69def
--- /dev/null
@@ -0,0 +1,10 @@
+--TEST--
+Bug #43527 (DateTime created from a timestamp reports environment timezone)
+--FILE--
+<?php
+date_default_timezone_set("Etc/GMT+1");
+$datetime = new DateTime('Fri, 07 Dec 2007 19:05:14 +1000');
+echo $datetime->getTimezone()->getName(), "\n";
+?>
+--EXPECT--
++10:00
diff --git a/ext/date/tests/bug43808.phpt b/ext/date/tests/bug43808.phpt
new file mode 100644 (file)
index 0000000..fe81021
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Bug #43808 (date_create never fails (even when it should))
+--FILE--
+<?php
+$date = date_create('asdfasdf');
+
+if ($date instanceof DateTime) {
+       echo "this is wrong, should be bool";
+}
+
+var_dump( $date );
+?>
+--EXPECT--
+bool(false)