]> granicus.if.org Git - php/commitdiff
Adding a new `createFromImmutable` method to the `DateTime` class to mirror the curre...
authorTrevor Suarez <rican7@gmail.com>
Thu, 5 Mar 2015 06:58:09 +0000 (01:58 -0500)
committerStanislav Malyshev <stas@php.net>
Mon, 23 Mar 2015 03:54:25 +0000 (20:54 -0700)
NEWS
ext/date/php_date.c
ext/date/php_date.h
ext/date/tests/DateTime_createFromImmutable.phpt [new file with mode: 0644]
ext/date/tests/DateTime_verify.phpt

diff --git a/NEWS b/NEWS
index f2ddfeba93659f3ba9b6df1b4efba0475c2a79c7..67a4b56f206507e250c8b0bcb1374a0dcb0cf665 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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)
index 0819b45df4ee4708da4bf1d4b978c29d68769225..4b7dfd2895b3d661202014d68f9865defec91722 100644 (file)
@@ -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)
 {
index 10498d0d01eba6e9e91b776124616c1825a9bdca..5429c4ffbed7675afb222b80ce80aff9c98dadc6 100644 (file)
@@ -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 (file)
index 0000000..bfde94d
--- /dev/null
@@ -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
index c7909747292ac3cf1cccc07c7512383db6a3eacc..a704f952045b84f0b081573978cc2148d115b03c 100644 (file)
@@ -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,103 +52,110 @@ 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"]=>