From da11bc2b32f51b4a7e50958fc85d7f3c724e90aa Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Sat, 26 Jan 2008 16:26:47 +0000 Subject: [PATCH] - MFH Bugfixes: - 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 | 8 ++ ext/date/lib/parse_date.c | 2 +- ext/date/lib/tm2unixtime.c | 2 + ext/date/php_date.c | 214 +++++++++++++++++++++++++++++------ ext/date/tests/bug40743.phpt | 40 +++++++ ext/date/tests/bug41599.phpt | 27 +++++ ext/date/tests/bug42910.phpt | 30 +++++ ext/date/tests/bug43003.phpt | 25 ++++ ext/date/tests/bug43527.phpt | 10 ++ ext/date/tests/bug43808.phpt | 14 +++ 10 files changed, 336 insertions(+), 36 deletions(-) create mode 100644 ext/date/tests/bug40743.phpt create mode 100644 ext/date/tests/bug41599.phpt create mode 100644 ext/date/tests/bug42910.phpt create mode 100644 ext/date/tests/bug43003.phpt create mode 100644 ext/date/tests/bug43527.phpt create mode 100644 ext/date/tests/bug43808.phpt diff --git a/NEWS b/NEWS index 44fd654115..178722681c 100644 --- 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 diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 45c3df331a..ef95b1903c 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -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" /* +----------------------------------------------------------------------+ diff --git a/ext/date/lib/tm2unixtime.c b/ext/date/lib/tm2unixtime.c index 3a7fd24478..4bd1f8f576 100644 --- a/ext/date/lib/tm2unixtime.c +++ b/ext/date/lib/tm2unixtime.c @@ -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) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index abf5d7e90c..9b05540d16 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -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 index 0000000000..f3ce17124d --- /dev/null +++ b/ext/date/tests/bug40743.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #40743 (DateTime ignores the TimeZone object passed to the constructor) +--FILE-- +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 index 0000000000..e4febe2cd8 --- /dev/null +++ b/ext/date/tests/bug41599.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #41599 (setTime() fails after modify() is used) +--FILE-- +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 index 0000000000..1bd0790812 --- /dev/null +++ b/ext/date/tests/bug42910.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #42910 (Constructing DateTime with TimeZone Indicator invalidates DateTimeZone) +--FILE-- +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 index 0000000000..3192d55dda --- /dev/null +++ b/ext/date/tests/bug43003.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #43003 (Invalid timezone reported for DateTime objects constructed using a timestamp) +--FILE-- +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 index 0000000000..cc69def7be --- /dev/null +++ b/ext/date/tests/bug43527.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #43527 (DateTime created from a timestamp reports environment timezone) +--FILE-- +getTimezone()->getName(), "\n"; +?> +--EXPECT-- ++10:00 diff --git a/ext/date/tests/bug43808.phpt b/ext/date/tests/bug43808.phpt new file mode 100644 index 0000000000..fe8102199e --- /dev/null +++ b/ext/date/tests/bug43808.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #43808 (date_create never fails (even when it should)) +--FILE-- + +--EXPECT-- +bool(false) -- 2.40.0