From b3469560f3886a8b509f9fcc6e64134cab62646c Mon Sep 17 00:00:00 2001 From: Lonny Kapelushnik Date: Sun, 30 Sep 2012 04:31:29 +0000 Subject: [PATCH] Fix bugs 62561,62896 (Modifying DateTime::__construct,date_create adds an hour) Prevent a unix timestamp, which is always GMT when being parsed, from taking on the local timezones DST flag. --- ext/date/lib/parse_date.re | 2 ++ ext/date/tests/bug62561.phpt | 16 +++++++++++++++ ext/date/tests/bug62896.phpt | 40 ++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 ext/date/tests/bug62561.phpt create mode 100644 ext/date/tests/bug62896.phpt diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index cca88580eb5..5a8b6134b95 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -1073,6 +1073,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of s->time->is_localtime = 1; s->time->zone_type = TIMELIB_ZONETYPE_OFFSET; s->time->z = 0; + s->time->dst = 0; TIMELIB_DEINIT; return TIMELIB_RELATIVE; @@ -2077,6 +2078,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim s->time->is_localtime = 1; s->time->zone_type = TIMELIB_ZONETYPE_OFFSET; s->time->z = 0; + s->time->dst = 0; break; case 'e': /* timezone */ diff --git a/ext/date/tests/bug62561.phpt b/ext/date/tests/bug62561.phpt new file mode 100644 index 00000000000..0ed32c15a14 --- /dev/null +++ b/ext/date/tests/bug62561.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #62561 Unixtimestamp may take on local times DST flag (this test will only be valid during EDT) +--FILE-- +add($int); + +echo 'ts: '.$ts->format('Y-m-d H:i:s')."\n"; +echo 'day from ts: '.$dayFromTs->format('Y-m-d H:i:s')."\n"; +?> +--EXPECT-- +ts: 2012-07-01 04:00:00 +day from ts: 2012-07-02 04:00:00 diff --git a/ext/date/tests/bug62896.phpt b/ext/date/tests/bug62896.phpt new file mode 100644 index 00000000000..7584546b5a4 --- /dev/null +++ b/ext/date/tests/bug62896.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #62896 Unixtimestamp may take on local times DST flag (this test will only be valid during CEST) +--FILE-- +format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; + + $date->modify('+0 days'); + echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; + + echo "FROM TIMESTAMP, WITH TZ:\n"; + + $date = new DateTime('@'.strtotime('2012-08-22 00:00:00 CEST')); + $date->setTimezone($tz); + echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; + + $date->modify('+0 days'); + echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; + + echo "FROM STRING:\n"; + + $date = new DateTime('2012-08-22 00:00:00 CEST', $tz); + echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; + + $date->modify('+0 days'); + echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; +--EXPECT-- +FROM TIMESTAMP, NO TZ: +2012-08-21 22:00:00 GMT+0000 (offset 0) +2012-08-21 22:00:00 GMT+0000 (offset 0) +FROM TIMESTAMP, WITH TZ: +2012-08-22 00:00:00 CEST (offset 7200) +2012-08-22 00:00:00 CEST (offset 7200) +FROM STRING: +2012-08-22 00:00:00 CEST (offset 7200) +2012-08-22 00:00:00 CEST (offset 7200)