]> granicus.if.org Git - php/commitdiff
Fix bug #54340 (DateTime::add() method bug).
authorAdam Harvey <aharvey@php.net>
Tue, 22 Mar 2011 08:33:22 +0000 (08:33 +0000)
committerAdam Harvey <aharvey@php.net>
Tue, 22 Mar 2011 08:33:22 +0000 (08:33 +0000)
NEWS
ext/date/php_date.c
ext/date/tests/bug54340.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 19b30dcd43e97c781ec27632b965faed4f4c2084..4ff165a6b050342c954c1b1d0de41ac1a00c4466 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ PHP                                                                        NEWS
     (tomas dot brastavicius at quantum dot lt, Pierrick)
 
 - DateTime extension:
+  . Fixed bug #54340 (DateTime::add() method bug). (Adam)
   . Fixed bug #54316 (DateTime::createFromFormat does not handle trailing '|'
     correctly). (Adam)
 
index 73a61c7e94302fe2e5dc8284ca017c8da34f816e..31470a5eec2d5951466811d7717e4dbf41655609 100644 (file)
@@ -2860,14 +2860,13 @@ PHP_FUNCTION(date_add)
                if (intobj->diff->invert) {
                        bias = -1;
                }
+               memset(&dateobj->time->relative, 0, sizeof(struct timelib_rel_time));
                dateobj->time->relative.y = intobj->diff->y * bias;
                dateobj->time->relative.m = intobj->diff->m * bias;
                dateobj->time->relative.d = intobj->diff->d * bias;
                dateobj->time->relative.h = intobj->diff->h * bias;
                dateobj->time->relative.i = intobj->diff->i * bias;
                dateobj->time->relative.s = intobj->diff->s * bias;
-               dateobj->time->relative.weekday = 0;
-               dateobj->time->relative.have_weekday_relative = 0;
        }
        dateobj->time->have_relative = 1;
        dateobj->time->sse_uptodate = 0;
@@ -2907,6 +2906,7 @@ PHP_FUNCTION(date_sub)
                bias = -1;
        }
 
+       memset(&dateobj->time->relative, 0, sizeof(struct timelib_rel_time));
        dateobj->time->relative.y = 0 - (intobj->diff->y * bias);
        dateobj->time->relative.m = 0 - (intobj->diff->m * bias);
        dateobj->time->relative.d = 0 - (intobj->diff->d * bias);
@@ -2914,8 +2914,6 @@ PHP_FUNCTION(date_sub)
        dateobj->time->relative.i = 0 - (intobj->diff->i * bias);
        dateobj->time->relative.s = 0 - (intobj->diff->s * bias);
        dateobj->time->have_relative = 1;
-       dateobj->time->relative.weekday = 0;
-       dateobj->time->relative.have_weekday_relative = 0;
        dateobj->time->sse_uptodate = 0;
 
        timelib_update_ts(dateobj->time, NULL);
diff --git a/ext/date/tests/bug54340.phpt b/ext/date/tests/bug54340.phpt
new file mode 100644 (file)
index 0000000..7f00309
--- /dev/null
@@ -0,0 +1,43 @@
+--TEST--
+Bug #54340 (DateTime::add() method bug)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$interval = new DateInterval('P1D');
+
+$dt = new DateTime('first day of January 2011');
+var_dump($dt);
+
+$dt->add($interval);
+var_dump($dt);
+
+$dt = new DateTime('first day of January 2011');
+
+$dt->sub($interval);
+var_dump($dt);
+--EXPECT--
+object(DateTime)#2 (3) {
+  ["date"]=>
+  string(19) "2011-01-01 00:00:00"
+  ["timezone_type"]=>
+  int(3)
+  ["timezone"]=>
+  string(3) "UTC"
+}
+object(DateTime)#2 (3) {
+  ["date"]=>
+  string(19) "2011-01-02 00:00:00"
+  ["timezone_type"]=>
+  int(3)
+  ["timezone"]=>
+  string(3) "UTC"
+}
+object(DateTime)#3 (3) {
+  ["date"]=>
+  string(19) "2010-12-31 00:00:00"
+  ["timezone_type"]=>
+  int(3)
+  ["timezone"]=>
+  string(3) "UTC"
+}