diff options
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | ext/date/php_date.c | 33 | ||||
-rw-r--r-- | ext/date/php_date.h | 1 | ||||
-rw-r--r-- | ext/date/tests/DateTime_createFromImmutable.phpt | 26 | ||||
-rw-r--r-- | ext/date/tests/DateTime_verify.phpt | 37 |
5 files changed, 85 insertions, 15 deletions
@@ -19,6 +19,9 @@ PHP NEWS - Curl: . Implemented FR#69278 (HTTP2 support). (Masaki Kagaya) +- Date: + . Added DateTime::createFromImmutable(). (Trevor Suarez) + - Enchant: . Fixed bug #65406 (Enchant broker plugins are in the wrong place in windows builds). (Anatol) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 0819b45df4..4b7dfd2895 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -185,6 +185,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_date_format, 0, 0, 2) ZEND_ARG_INFO(0, format) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_create_from_immutable, 0, 0, 1) + ZEND_ARG_INFO(0, DateTimeImmutable) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_format, 0, 0, 1) ZEND_ARG_INFO(0, format) ZEND_END_ARG_INFO() @@ -464,6 +468,7 @@ const zend_function_entry date_funcs_date[] = { PHP_ME(DateTime, __construct, arginfo_date_create, ZEND_ACC_CTOR|ZEND_ACC_PUBLIC) PHP_ME(DateTime, __wakeup, NULL, ZEND_ACC_PUBLIC) PHP_ME(DateTime, __set_state, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + PHP_ME(DateTime, createFromImmutable, arginfo_date_method_create_from_immutable, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME_MAPPING(createFromFormat, date_create_from_format, arginfo_date_create_from_format, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME_MAPPING(getLastErrors, date_get_last_errors, arginfo_date_get_last_errors, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME_MAPPING(format, date_format, arginfo_date_method_format, 0) @@ -2884,6 +2889,34 @@ PHP_METHOD(DateTime, __wakeup) } /* }}} */ +/* {{{ proto DateTime::createFromImmutable(DateTimeImmutable object) + Creates new DateTime object from an existing DateTimeImmutable object. +*/ +PHP_METHOD(DateTime, createFromImmutable) +{ + zval *datetimeimmutable_object = NULL; + php_date_obj *new_obj = NULL; + php_date_obj *old_obj = NULL; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &datetimeimmutable_object, date_ce_immutable) == FAILURE) { + return; + } + + php_date_instantiate(date_ce_date, return_value TSRMLS_CC); + old_obj = (php_date_obj *) zend_object_store_get_object(datetimeimmutable_object TSRMLS_CC); + new_obj = (php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC); + + new_obj->time = timelib_time_ctor(); + *new_obj->time = *old_obj->time; + if (old_obj->time->tz_abbr) { + new_obj->time->tz_abbr = strdup(old_obj->time->tz_abbr); + } + if (old_obj->time->tz_info) { + new_obj->time->tz_info = old_obj->time->tz_info; + } +} +/* }}} */ + /* Helper function used to add an associative array of warnings and errors to a zval */ static void zval_from_error_container(zval *z, timelib_error_container *error) { diff --git a/ext/date/php_date.h b/ext/date/php_date.h index 10498d0d01..5429c4ffbe 100644 --- a/ext/date/php_date.h +++ b/ext/date/php_date.h @@ -50,6 +50,7 @@ PHP_FUNCTION(getdate); PHP_METHOD(DateTime, __construct); PHP_METHOD(DateTime, __wakeup); PHP_METHOD(DateTime, __set_state); +PHP_METHOD(DateTime, createFromImmutable); PHP_FUNCTION(date_create); PHP_FUNCTION(date_create_immutable); PHP_FUNCTION(date_create_from_format); diff --git a/ext/date/tests/DateTime_createFromImmutable.phpt b/ext/date/tests/DateTime_createFromImmutable.phpt new file mode 100644 index 0000000000..bfde94d825 --- /dev/null +++ b/ext/date/tests/DateTime_createFromImmutable.phpt @@ -0,0 +1,26 @@ +--TEST-- +Tests for DateTime::createFromImmutable. +--INI-- +date.timezone=America/New_York +--FILE-- +<?php +$current = "2015-03-05 07:00:16"; + +$i = DateTime::createFromImmutable(date_create_immutable($current)); +var_dump($i); + +$i = DateTime::createFromImmutable(date_create($current)); +var_dump($i); +?> +--EXPECTF-- +object(DateTime)#%d (3) { + ["date"]=> + string(26) "2015-03-05 07:00:16.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "America/New_York" +} + +Warning: DateTime::createFromImmutable() expects parameter 1 to be DateTimeImmutable, object given in %stests%eDateTime_createFromImmutable.php on line %d +NULL diff --git a/ext/date/tests/DateTime_verify.phpt b/ext/date/tests/DateTime_verify.phpt index c790974729..a704f95204 100644 --- a/ext/date/tests/DateTime_verify.phpt +++ b/ext/date/tests/DateTime_verify.phpt @@ -27,7 +27,7 @@ object(ReflectionClass)#%d (1) { string(8) "DateTime" } ..and get names of all its methods -array(18) { +array(19) { [0]=> &object(ReflectionMethod)#%d (2) { ["name"]=> @@ -52,104 +52,111 @@ array(18) { [3]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(16) "createFromFormat" + string(19) "createFromImmutable" ["class"]=> string(8) "DateTime" } [4]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(13) "getLastErrors" + string(16) "createFromFormat" ["class"]=> string(8) "DateTime" } [5]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(6) "format" + string(13) "getLastErrors" ["class"]=> string(8) "DateTime" } [6]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(6) "modify" + string(6) "format" ["class"]=> string(8) "DateTime" } [7]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(3) "add" + string(6) "modify" ["class"]=> string(8) "DateTime" } [8]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(3) "sub" + string(3) "add" ["class"]=> string(8) "DateTime" } [9]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(11) "getTimezone" + string(3) "sub" ["class"]=> string(8) "DateTime" } [10]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(11) "setTimezone" + string(11) "getTimezone" ["class"]=> string(8) "DateTime" } [11]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(9) "getOffset" + string(11) "setTimezone" ["class"]=> string(8) "DateTime" } [12]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(7) "setTime" + string(9) "getOffset" ["class"]=> string(8) "DateTime" } [13]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(7) "setDate" + string(7) "setTime" ["class"]=> string(8) "DateTime" } [14]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(10) "setISODate" + string(7) "setDate" ["class"]=> string(8) "DateTime" } [15]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(12) "setTimestamp" + string(10) "setISODate" ["class"]=> string(8) "DateTime" } [16]=> &object(ReflectionMethod)#%d (2) { ["name"]=> - string(12) "getTimestamp" + string(12) "setTimestamp" ["class"]=> string(8) "DateTime" } [17]=> &object(ReflectionMethod)#%d (2) { ["name"]=> + string(12) "getTimestamp" + ["class"]=> + string(8) "DateTime" + } + [18]=> + object(ReflectionMethod)#%d (2) { + ["name"]=> string(4) "diff" ["class"]=> string(8) "DateTime" |