derick Fri May 2 12:49:16 2008 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/date php_date.c php_date.h /php-src/ext/date/lib tm2unixtime.c Log: - MFH: Added DateInterval::createFromDateString() that creates an interval from the relative parts of a date/time string. - MFH: Fixed an issue where special relative bits were not applied. http://cvs.php.net/viewvc.cgi/php-src/ext/date/php_date.c?r1=1.43.2.45.2.51.2.33&r2=1.43.2.45.2.51.2.34&diff_format=u Index: php-src/ext/date/php_date.c diff -u php-src/ext/date/php_date.c:1.43.2.45.2.51.2.33 php-src/ext/date/php_date.c:1.43.2.45.2.51.2.34 --- php-src/ext/date/php_date.c:1.43.2.45.2.51.2.33 Thu May 1 16:15:26 2008 +++ php-src/ext/date/php_date.c Fri May 2 12:49:16 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_date.c,v 1.43.2.45.2.51.2.33 2008/05/01 16:15:26 derick Exp $ */ +/* $Id: php_date.c,v 1.43.2.45.2.51.2.34 2008/05/02 12:49:16 derick Exp $ */ #include "php.h" #include "php_streams.h" @@ -196,6 +196,7 @@ PHP_FE(timezone_identifiers_list, NULL) PHP_FE(timezone_abbreviations_list, NULL) + PHP_FE(date_interval_create_from_date_string, NULL) PHP_FE(date_interval_format, NULL) /* Options and Configuration */ @@ -244,6 +245,7 @@ const zend_function_entry date_funcs_interval[] = { PHP_ME(DateInterval, __construct, NULL, ZEND_ACC_CTOR|ZEND_ACC_PUBLIC) PHP_ME_MAPPING(format, date_interval_format, NULL, 0) + PHP_ME_MAPPING(createFromDateString, date_interval_create_from_date_string, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) {NULL, NULL, NULL} }; @@ -1629,6 +1631,7 @@ /* apply modification if it's not the first iteration */ if (!object->include_start_date || iterator->current_index > 0) { + it_time->have_relative = 1; it_time->relative.y = object->interval->y; it_time->relative.m = object->interval->m; it_time->relative.d = object->interval->d; @@ -1636,7 +1639,9 @@ it_time->relative.i = object->interval->i; it_time->relative.s = object->interval->s; it_time->relative.weekday = object->interval->weekday; - it_time->have_relative = 1; + it_time->relative.special = object->interval->special; + it_time->relative.have_weekday_relative = object->interval->have_weekday_relative; + it_time->relative.have_special_relative = object->interval->have_special_relative; it_time->sse_uptodate = 0; timelib_update_ts(it_time, NULL); timelib_update_from_sse(it_time); @@ -2246,8 +2251,8 @@ } /* }}} */ -/* {{{ proto DateTime date_create(string format, string time[, DateTimeZone object]) - Returns new DateTime object +/* {{{ proto DateTime date_create_from_format(string format, string time[, DateTimeZone object]) + Returns new DateTime object formatted according to the specified format */ PHP_FUNCTION(date_create_from_format) { @@ -3254,7 +3259,7 @@ timelib_rel_time *reltime; php_set_error_handling(EH_THROW, NULL TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &interval_string, &interval_string_length) == SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &interval_string, &interval_string_length) == SUCCESS) { if (date_interval_initialize(&reltime, interval_string, interval_string_length TSRMLS_CC) == SUCCESS) { diobj = zend_object_store_get_object(getThis() TSRMLS_CC); diobj->diff = reltime; @@ -3267,6 +3272,31 @@ } /* }}} */ +/* {{{ proto DateInterval date_interval_create_from_date_string(string time) + Uses the normal date parsers and sets up a DateInterval from the relative parts of the parsed string +*/ +PHP_FUNCTION(date_interval_create_from_date_string) +{ + char *time_str = NULL; + int time_str_len = 0; + timelib_time *time; + timelib_error_container *err = NULL; + php_interval_obj *diobj; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &time_str, &time_str_len) == FAILURE) { + RETURN_FALSE; + } + + date_instantiate(date_ce_interval, return_value TSRMLS_CC); + + time = timelib_strtotime(time_str, time_str_len, &err, DATE_TIMEZONEDB); + diobj = (php_interval_obj *) zend_object_store_get_object(return_value TSRMLS_CC); + diobj->diff = timelib_rel_time_clone(&time->relative); + timelib_time_dtor(time); + timelib_error_container_dtor(err); +} +/* }}} */ + /* {{{ date_interval_format - */ static char *date_interval_format(char *format, int format_len, timelib_rel_time *t) { http://cvs.php.net/viewvc.cgi/php-src/ext/date/php_date.h?r1=1.17.2.11.2.3.2.7&r2=1.17.2.11.2.3.2.8&diff_format=u Index: php-src/ext/date/php_date.h diff -u php-src/ext/date/php_date.h:1.17.2.11.2.3.2.7 php-src/ext/date/php_date.h:1.17.2.11.2.3.2.8 --- php-src/ext/date/php_date.h:1.17.2.11.2.3.2.7 Thu May 1 00:12:24 2008 +++ php-src/ext/date/php_date.h Fri May 2 12:49:16 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_date.h,v 1.17.2.11.2.3.2.7 2008/05/01 00:12:24 derick Exp $ */ +/* $Id: php_date.h,v 1.17.2.11.2.3.2.8 2008/05/02 12:49:16 derick Exp $ */ #ifndef PHP_DATE_H #define PHP_DATE_H @@ -81,6 +81,7 @@ PHP_METHOD(DateInterval, __construct); PHP_FUNCTION(date_interval_format); +PHP_FUNCTION(date_interval_create_from_date_string); PHP_METHOD(DatePeriod, __construct); http://cvs.php.net/viewvc.cgi/php-src/ext/date/lib/tm2unixtime.c?r1=1.13.2.3.2.2.2.6&r2=1.13.2.3.2.2.2.7&diff_format=u Index: php-src/ext/date/lib/tm2unixtime.c diff -u php-src/ext/date/lib/tm2unixtime.c:1.13.2.3.2.2.2.6 php-src/ext/date/lib/tm2unixtime.c:1.13.2.3.2.2.2.7 --- php-src/ext/date/lib/tm2unixtime.c:1.13.2.3.2.2.2.6 Thu May 1 16:15:45 2008 +++ php-src/ext/date/lib/tm2unixtime.c Fri May 2 12:49:16 2008 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: tm2unixtime.c,v 1.13.2.3.2.2.2.6 2008/05/01 16:15:45 derick Exp $ */ +/* $Id: tm2unixtime.c,v 1.13.2.3.2.2.2.7 2008/05/02 12:49:16 derick Exp $ */ #include "timelib.h" @@ -193,9 +193,6 @@ break; } do_normalize(time); - - memset(&(time->relative), 0, sizeof(time->relative)); - time->have_relative = 0; } static void do_adjust_special_weekday(timelib_time* time)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php