diff options
author | Stanislav Malyshev <stas@php.net> | 2012-09-30 20:09:27 -0700 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2012-09-30 20:19:36 -0700 |
commit | 40bb9254c59504af21a128355ea6892961291ace (patch) | |
tree | d229027ee89d0b1b4ca2448fbae0b44fd1ec2960 | |
parent | d3c37f0937dd4445eedb3a5b8b385aaf0b5de24f (diff) | |
parent | b3469560f3886a8b509f9fcc6e64134cab62646c (diff) | |
download | php-git-40bb9254c59504af21a128355ea6892961291ace.tar.gz |
Merge branch 'pull-request/210' into PHP-5.4
* pull-request/210:
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.
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | ext/date/lib/parse_date.c | 100 | ||||
-rw-r--r-- | ext/date/lib/parse_date.re | 2 | ||||
-rw-r--r-- | ext/date/tests/bug62561.phpt | 16 | ||||
-rw-r--r-- | ext/date/tests/bug62896.phpt | 40 |
5 files changed, 114 insertions, 49 deletions
@@ -33,6 +33,11 @@ PHP NEWS . Fixed bug #62085 (file_get_contents a remote file by Curl wrapper will cause cpu Soaring). (Pierrick) +- Date: + . Fixed bug #62896 ("DateTime->modify('+0 days')" modifies DateTime object) + (Lonny Kapelushnik) + . Fixed bug #62561 (DateTime add 'P1D' adds 25 hours). (Lonny Kapelushnik) + - DOM: . Fixed bug #63015 (Incorrect arginfo for DOMErrorHandler). (Rob) diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 964f10d912..4829da6c91 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Mon Dec 5 22:02:27 2011 */ +/* Generated by re2c 0.13.5 on Sun Sep 30 20:14:42 2012 */ #line 1 "ext/date/lib/parse_date.re" /* +----------------------------------------------------------------------+ @@ -995,7 +995,7 @@ std: } yy2: YYDEBUG(2, *YYCURSOR); -#line 1082 "ext/date/lib/parse_date.re" +#line 1083 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("firstdayof | lastdayof"); TIMELIB_INIT; @@ -1034,7 +1034,7 @@ yy3: } yy4: YYDEBUG(4, *YYCURSOR); -#line 1676 "ext/date/lib/parse_date.re" +#line 1677 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("tzcorrection | tz"); @@ -1358,7 +1358,7 @@ yy12: if (yych <= '9') goto yy1385; yy13: YYDEBUG(13, *YYCURSOR); -#line 1771 "ext/date/lib/parse_date.re" +#line 1772 "ext/date/lib/parse_date.re" { add_error(s, "Unexpected character"); goto std; @@ -2420,7 +2420,7 @@ yy49: if (yych <= '9') goto yy55; yy50: YYDEBUG(50, *YYCURSOR); -#line 1760 "ext/date/lib/parse_date.re" +#line 1761 "ext/date/lib/parse_date.re" { goto std; } @@ -2433,7 +2433,7 @@ yy52: YYDEBUG(52, *YYCURSOR); ++YYCURSOR; YYDEBUG(53, *YYCURSOR); -#line 1765 "ext/date/lib/parse_date.re" +#line 1766 "ext/date/lib/parse_date.re" { s->pos = cursor; s->line++; goto std; @@ -2825,7 +2825,7 @@ yy72: if (yych == 's') goto yy74; yy73: YYDEBUG(73, *YYCURSOR); -#line 1744 "ext/date/lib/parse_date.re" +#line 1745 "ext/date/lib/parse_date.re" { timelib_ull i; DEBUG_OUTPUT("relative"); @@ -3602,7 +3602,7 @@ yy166: } yy167: YYDEBUG(167, *YYCURSOR); -#line 1607 "ext/date/lib/parse_date.re" +#line 1608 "ext/date/lib/parse_date.re" { const timelib_relunit* relunit; DEBUG_OUTPUT("daytext"); @@ -4139,7 +4139,7 @@ yy193: } yy194: YYDEBUG(194, *YYCURSOR); -#line 1666 "ext/date/lib/parse_date.re" +#line 1667 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("monthtext"); TIMELIB_INIT; @@ -4199,7 +4199,7 @@ yy198: } yy199: YYDEBUG(199, *YYCURSOR); -#line 1412 "ext/date/lib/parse_date.re" +#line 1413 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datetextual | datenoyear"); @@ -4481,7 +4481,7 @@ yy222: } yy223: YYDEBUG(223, *YYCURSOR); -#line 1714 "ext/date/lib/parse_date.re" +#line 1715 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz"); @@ -5208,7 +5208,7 @@ yy278: YYDEBUG(278, *YYCURSOR); ++YYCURSOR; YYDEBUG(279, *YYCURSOR); -#line 1690 "ext/date/lib/parse_date.re" +#line 1691 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12"); TIMELIB_INIT; @@ -5409,7 +5409,7 @@ yy294: ++YYCURSOR; yy295: YYDEBUG(295, *YYCURSOR); -#line 1384 "ext/date/lib/parse_date.re" +#line 1385 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenoday"); @@ -6642,7 +6642,7 @@ yy362: if (yych <= '9') goto yy365; yy364: YYDEBUG(364, *YYCURSOR); -#line 1528 "ext/date/lib/parse_date.re" +#line 1529 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextshort"); @@ -7293,7 +7293,7 @@ yy392: } yy393: YYDEBUG(393, *YYCURSOR); -#line 1586 "ext/date/lib/parse_date.re" +#line 1587 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("ago"); TIMELIB_INIT; @@ -9063,7 +9063,7 @@ yy454: ++YYCURSOR; yy455: YYDEBUG(455, *YYCURSOR); -#line 1289 "ext/date/lib/parse_date.re" +#line 1290 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash"); TIMELIB_INIT; @@ -9634,7 +9634,7 @@ yy475: } yy476: YYDEBUG(476, *YYCURSOR); -#line 1426 "ext/date/lib/parse_date.re" +#line 1427 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenoyearrev"); TIMELIB_INIT; @@ -9786,7 +9786,7 @@ yy488: YYDEBUG(488, *YYCURSOR); ++YYCURSOR; YYDEBUG(489, *YYCURSOR); -#line 1144 "ext/date/lib/parse_date.re" +#line 1145 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12"); TIMELIB_INIT; @@ -9815,7 +9815,7 @@ yy490: } yy491: YYDEBUG(491, *YYCURSOR); -#line 1181 "ext/date/lib/parse_date.re" +#line 1182 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long"); @@ -10150,7 +10150,7 @@ yy523: YYDEBUG(523, *YYCURSOR); ++YYCURSOR; YYDEBUG(524, *YYCURSOR); -#line 1161 "ext/date/lib/parse_date.re" +#line 1162 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("mssqltime"); TIMELIB_INIT; @@ -10275,7 +10275,7 @@ yy534: if (yych <= '9') goto yy541; yy535: YYDEBUG(535, *YYCURSOR); -#line 1343 "ext/date/lib/parse_date.re" +#line 1344 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datefull"); @@ -11026,7 +11026,7 @@ yy605: YYDEBUG(606, *YYCURSOR); ++YYCURSOR; YYDEBUG(607, *YYCURSOR); -#line 1358 "ext/date/lib/parse_date.re" +#line 1359 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pointed date YYYY"); TIMELIB_INIT; @@ -11073,7 +11073,7 @@ yy611: if (yych <= '9') goto yy605; yy612: YYDEBUG(612, *YYCURSOR); -#line 1370 "ext/date/lib/parse_date.re" +#line 1371 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pointed date YY"); @@ -11727,7 +11727,7 @@ yy656: } yy657: YYDEBUG(657, *YYCURSOR); -#line 1329 "ext/date/lib/parse_date.re" +#line 1330 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshort"); @@ -11846,7 +11846,7 @@ yy666: } yy667: YYDEBUG(667, *YYCURSOR); -#line 1273 "ext/date/lib/parse_date.re" +#line 1274 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("americanshort | american"); @@ -12094,7 +12094,7 @@ yy700: if (yych <= ':') goto yy704; yy701: YYDEBUG(701, *YYCURSOR); -#line 1556 "ext/date/lib/parse_date.re" +#line 1557 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("clf"); @@ -12666,7 +12666,7 @@ yy763: } yy764: YYDEBUG(764, *YYCURSOR); -#line 1301 "ext/date/lib/parse_date.re" +#line 1302 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("iso8601date2"); @@ -12718,7 +12718,7 @@ yy771: YYDEBUG(771, *YYCURSOR); ++YYCURSOR; YYDEBUG(772, *YYCURSOR); -#line 1542 "ext/date/lib/parse_date.re" +#line 1543 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextreverse"); @@ -12869,7 +12869,7 @@ yy783: } yy784: YYDEBUG(784, *YYCURSOR); -#line 1577 "ext/date/lib/parse_date.re" +#line 1578 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("year4"); TIMELIB_INIT; @@ -13028,7 +13028,7 @@ yy793: } yy794: YYDEBUG(794, *YYCURSOR); -#line 1398 "ext/date/lib/parse_date.re" +#line 1399 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenodayrev"); @@ -13256,7 +13256,7 @@ yy814: if (yych <= '7') goto yy817; yy815: YYDEBUG(815, *YYCURSOR); -#line 1509 "ext/date/lib/parse_date.re" +#line 1510 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweek"); @@ -13284,7 +13284,7 @@ yy817: YYDEBUG(817, *YYCURSOR); ++YYCURSOR; YYDEBUG(818, *YYCURSOR); -#line 1490 "ext/date/lib/parse_date.re" +#line 1491 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweekday"); @@ -13366,7 +13366,7 @@ yy821: } yy822: YYDEBUG(822, *YYCURSOR); -#line 1476 "ext/date/lib/parse_date.re" +#line 1477 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgydotd"); @@ -13482,7 +13482,7 @@ yy842: ++YYCURSOR; yy843: YYDEBUG(843, *YYCURSOR); -#line 1450 "ext/date/lib/parse_date.re" +#line 1451 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif"); @@ -13769,7 +13769,7 @@ yy848: } yy849: YYDEBUG(849, *YYCURSOR); -#line 1438 "ext/date/lib/parse_date.re" +#line 1439 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenocolon"); TIMELIB_INIT; @@ -14700,7 +14700,7 @@ yy973: if (yych <= '9') goto yy996; yy974: YYDEBUG(974, *YYCURSOR); -#line 1315 "ext/date/lib/parse_date.re" +#line 1316 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshorter"); @@ -15722,7 +15722,7 @@ yy1066: } yy1068: YYDEBUG(1068, *YYCURSOR); -#line 1207 "ext/date/lib/parse_date.re" +#line 1208 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -15836,7 +15836,7 @@ yy1075: } yy1076: YYDEBUG(1076, *YYCURSOR); -#line 1253 "ext/date/lib/parse_date.re" +#line 1254 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("iso8601nocolon"); @@ -16753,7 +16753,7 @@ yy1117: } yy1118: YYDEBUG(1118, *YYCURSOR); -#line 1649 "ext/date/lib/parse_date.re" +#line 1650 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16820,7 +16820,7 @@ yy1126: YYDEBUG(1126, *YYCURSOR); ++YYCURSOR; YYDEBUG(1127, *YYCURSOR); -#line 1122 "ext/date/lib/parse_date.re" +#line 1123 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16949,7 +16949,7 @@ yy1141: } yy1142: YYDEBUG(1142, *YYCURSOR); -#line 1625 "ext/date/lib/parse_date.re" +#line 1626 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -19649,7 +19649,7 @@ yy1294: goto yy1298; yy1295: YYDEBUG(1295, *YYCURSOR); -#line 1099 "ext/date/lib/parse_date.re" +#line 1100 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("backof | frontof"); TIMELIB_INIT; @@ -21382,11 +21382,12 @@ yy1387: 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; } -#line 21390 "ext/date/lib/parse_date.c" +#line 21391 "ext/date/lib/parse_date.c" yy1388: YYDEBUG(1388, *YYCURSOR); yych = *++YYCURSOR; @@ -21833,7 +21834,7 @@ yy1417: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21837 "ext/date/lib/parse_date.c" +#line 21838 "ext/date/lib/parse_date.c" yy1418: YYDEBUG(1418, *YYCURSOR); yych = *++YYCURSOR; @@ -21877,7 +21878,7 @@ yy1420: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21881 "ext/date/lib/parse_date.c" +#line 21882 "ext/date/lib/parse_date.c" yy1421: YYDEBUG(1421, *YYCURSOR); yych = *++YYCURSOR; @@ -23897,7 +23898,7 @@ yy1500: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 23901 "ext/date/lib/parse_date.c" +#line 23902 "ext/date/lib/parse_date.c" yy1501: YYDEBUG(1501, *YYCURSOR); yych = *++YYCURSOR; @@ -24047,7 +24048,7 @@ yy1508: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 24051 "ext/date/lib/parse_date.c" +#line 24052 "ext/date/lib/parse_date.c" yy1509: YYDEBUG(1509, *YYCURSOR); yyaccept = 0; @@ -24591,7 +24592,7 @@ yy1531: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 24595 "ext/date/lib/parse_date.c" +#line 24596 "ext/date/lib/parse_date.c" yy1532: YYDEBUG(1532, *YYCURSOR); yyaccept = 0; @@ -24764,7 +24765,7 @@ yy1537: goto yy1531; } } -#line 1775 "ext/date/lib/parse_date.re" +#line 1776 "ext/date/lib/parse_date.re" } @@ -25070,6 +25071,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/lib/parse_date.re b/ext/date/lib/parse_date.re index cca88580eb..5a8b6134b9 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 0000000000..0ed32c15a1 --- /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-- +<?php +$tz = new DateTimeZone('America/New_York'); +$ts = new DateTime('@1341115200', $tz); +$int = new DateInterval('P1D'); +$dayFromTs = new DateTime('@1341115200', new DateTimeZone('America/New_York')); +$dayFromTs->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 0000000000..7584546b5a --- /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-- +<?php + $tz = new DateTimeZone('Europe/Berlin'); + + echo "FROM TIMESTAMP, NO TZ:\n"; + + $date = new DateTime('@'.strtotime('2012-08-22 00:00:00 CEST')); + 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 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) |