]> granicus.if.org Git - php/commitdiff
- Fixed bug #43003 (Invalid timezone reported for DateTime objects constructed
authorDerick Rethans <derick@php.net>
Thu, 17 Jan 2008 19:58:24 +0000 (19:58 +0000)
committerDerick Rethans <derick@php.net>
Thu, 17 Jan 2008 19:58:24 +0000 (19:58 +0000)
  using a timestamp).

ext/date/php_date.c
ext/date/tests/bug43003.phpt [new file with mode: 0644]

index 6b6482351eeb01b9e68a8d7e93b1bb1d9db57764..dd8216d5e793f9a6f3217cca66b8e81ed6e8d577 100644 (file)
@@ -276,6 +276,7 @@ struct _php_date_obj {
 
 struct _php_timezone_obj {
        zend_object     std;
+       int             initialized;
        int             type;
        union {
                timelib_tzinfo *tz; // TIMELIB_ZONETYPE_ID;
@@ -1762,6 +1763,7 @@ static zend_object_value date_object_clone_timezone(zval *this_ptr TSRMLS_DC)
        
        zend_objects_clone_members(&new_obj->std, new_ov, &old_obj->std, Z_OBJ_HANDLE_P(this_ptr) TSRMLS_CC);
        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;
@@ -2210,6 +2212,7 @@ PHP_FUNCTION(date_timezone_get)
        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->initialized = 1;
                tzobj->type = dateobj->time->zone_type;
                switch (dateobj->time->zone_type) {
                        case TIMELIB_ZONETYPE_ID:
@@ -2435,6 +2438,7 @@ PHP_METHOD(DateTimeZone, __construct)
                        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());
                }
@@ -2455,7 +2459,7 @@ PHP_FUNCTION(timezone_name_get)
                RETURN_FALSE;
        }
        tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       DATE_CHECK_INITIALIZED(tzobj->tzi.tz, DateTimeZone);
+       DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
 
        switch (tzobj->type) {
                case TIMELIB_ZONETYPE_ID:
@@ -2518,7 +2522,7 @@ PHP_FUNCTION(timezone_offset_get)
                RETURN_FALSE;
        }
        tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       DATE_CHECK_INITIALIZED(tzobj->tzi.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);
 
@@ -2541,7 +2545,7 @@ PHP_FUNCTION(timezone_transitions_get)
                RETURN_FALSE;
        }
        tzobj = (php_timezone_obj *) zend_object_store_get_object(object TSRMLS_CC);
-       DATE_CHECK_INITIALIZED(tzobj->tzi.tz, DateTimeZone);
+       DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone);
        if (tzobj->type != TIMELIB_ZONETYPE_ID) {
                RETURN_FALSE;
        }
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