derick                                   Sat, 26 Nov 2011 16:44:21 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=319960

Log:
- Fixed bug #54851 (DateTime::createFromFormat() doesn't interpret "D").

Bug: https://bugs.php.net/54851 (Assigned) DateTime::createFromFormat, 
$format=='D' or $format=='l' Always Returns Today.
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.c
    U   php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.re
    A   php/php-src/branches/PHP_5_3/ext/date/tests/bug54851.phpt
    U   php/php-src/branches/PHP_5_4/ext/date/lib/parse_date.c
    U   php/php-src/branches/PHP_5_4/ext/date/lib/parse_date.re
    A   php/php-src/branches/PHP_5_4/ext/date/tests/bug54851.phpt
    U   php/php-src/trunk/ext/date/lib/parse_date.c
    U   php/php-src/trunk/ext/date/lib/parse_date.re
    A   php/php-src/trunk/ext/date/tests/bug54851.phpt

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2011-11-26 16:13:39 UTC (rev 319959)
+++ php/php-src/branches/PHP_5_3/NEWS	2011-11-26 16:44:21 UTC (rev 319960)
@@ -33,6 +33,8 @@
     timestamp). (Derick)
   . Fixed bug #55253 (DateTime::add() and sub() result -1 hour on objects with
     time zone type 2). (Derick)
+  . Fixed bug #54851 (DateTime::createFromFormat() doesn't interpret "D").
+    (Derick)
   . Fixed bug #54596 (incorrect years for DateTime objects created with 4-digit
     years). (Derick)


Modified: php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.c	2011-11-26 16:13:39 UTC (rev 319959)
+++ php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.c	2011-11-26 16:44:21 UTC (rev 319960)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Fri Nov 25 16:42:41 2011 */
+/* Generated by re2c 0.13.5 on Sat Nov 26 16:43:31 2011 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
    +----------------------------------------------------------------------+
@@ -24917,8 +24917,19 @@
 		switch (*fptr) {
 			case 'D': /* three letter day */
 			case 'l': /* full day */
-				if (!timelib_lookup_relunit((char **) &ptr)) {
-					add_pbf_error(s, "A textual day could not be found", string, begin);
+				{
+					const timelib_relunit* tmprel = 0;
+
+					tmprel = timelib_lookup_relunit((char **) &ptr);
+					if (!tmprel) {
+						add_pbf_error(s, "A textual day could not be found", string, begin);
+						break;
+					} else {
+						in.time->have_relative = 1;
+						in.time->relative.have_weekday_relative = 1;
+						in.time->relative.weekday = tmprel->multiplier;
+						in.time->relative.weekday_behavior = 1;
+					}
 				}
 				break;
 			case 'd': /* two digit day, with leading zero */
@@ -25001,15 +25012,31 @@
 				}
 				break;
 			case 'i': /* two digit minute, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->i = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit minute could not be found", string, begin);
+				{
+					int length;
+					timelib_sll min;
+
+					TIMELIB_CHECK_NUMBER;
+					min = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (min == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two digit minute could not be found", string, begin);
+					} else {
+						s->time->i = min;
+					}
 				}
 				break;
 			case 's': /* two digit second, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->s = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit second could not be found", string, begin);
+				{
+					int length;
+					timelib_sll sec;
+
+					TIMELIB_CHECK_NUMBER;
+					sec = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (sec == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two second minute could not be found", string, begin);
+					} else {
+						s->time->s = sec;
+					}
 				}
 				break;
 			case 'u': /* up to six digit millisecond */

Modified: php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.re
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.re	2011-11-26 16:13:39 UTC (rev 319959)
+++ php/php-src/branches/PHP_5_3/ext/date/lib/parse_date.re	2011-11-26 16:44:21 UTC (rev 319960)
@@ -1924,8 +1924,19 @@
 		switch (*fptr) {
 			case 'D': /* three letter day */
 			case 'l': /* full day */
-				if (!timelib_lookup_relunit((char **) &ptr)) {
-					add_pbf_error(s, "A textual day could not be found", string, begin);
+				{
+					const timelib_relunit* tmprel = 0;
+
+					tmprel = timelib_lookup_relunit((char **) &ptr);
+					if (!tmprel) {
+						add_pbf_error(s, "A textual day could not be found", string, begin);
+						break;
+					} else {
+						in.time->have_relative = 1;
+						in.time->relative.have_weekday_relative = 1;
+						in.time->relative.weekday = tmprel->multiplier;
+						in.time->relative.weekday_behavior = 1;
+					}
 				}
 				break;
 			case 'd': /* two digit day, with leading zero */
@@ -2008,15 +2019,31 @@
 				}
 				break;
 			case 'i': /* two digit minute, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->i = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit minute could not be found", string, begin);
+				{
+					int length;
+					timelib_sll min;
+
+					TIMELIB_CHECK_NUMBER;
+					min = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (min == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two digit minute could not be found", string, begin);
+					} else {
+						s->time->i = min;
+					}
 				}
 				break;
 			case 's': /* two digit second, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->s = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit second could not be found", string, begin);
+				{
+					int length;
+					timelib_sll sec;
+
+					TIMELIB_CHECK_NUMBER;
+					sec = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (sec == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two second minute could not be found", string, begin);
+					} else {
+						s->time->s = sec;
+					}
 				}
 				break;
 			case 'u': /* up to six digit millisecond */

Added: php/php-src/branches/PHP_5_3/ext/date/tests/bug54851.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/date/tests/bug54851.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/date/tests/bug54851.phpt	2011-11-26 16:44:21 UTC (rev 319960)
@@ -0,0 +1,57 @@
+--TEST--
+Bug #54851: DateTime::createFromFormat() doesn't interpret "D".
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$date = new DateTime("2011-05-17T22:14:12");
+$date2 = DateTime::createFromFormat("D H i s", $date->format("D"). ' 0 0 0');
+echo $date->format("r"), "\n";
+echo $date2->format("r"), "\n";
+var_dump($date->format("D") == $date2->format("D"));
+
+// Verify that our implementation works regardless of position
+$datePre = DateTime::createFromFormat("!D d M Y", "Fri 17 may 2011");
+$datePost = DateTime::createFromFormat("!d M Y D", "17 may 2011 Fri");
+echo $datePre->format("r"), "\n";
+echo $datePost->format("r"), "\n";
+var_dump($datePre->format("Y-m-d") == $datePost->format("Y-m-d"));
+
+// Verify that our implementation is the same as for the constructor and
+// strtotime
+$date1 = new DateTime("Tuesday");
+$date2 = DateTime::createFromFormat("D H i s", "Tuesday 0 0 0");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('D') == $date2->format('D'));
+
+// - when the day is not the same as the day on the original date:
+$date1 = DateTime::createFromFormat("!D d M Y", "Fri 19 November 2011");
+$date2 = new DateTime("Fri 19 November 2011");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('Y-m-d') == $date2->format('Y-m-d'));
+
+// - when the day *is* the same as the day on the original date:
+$date1 = DateTime::createFromFormat("!D d M Y", "Sat 19 November 2011");
+$date2 = new DateTime("Sat 19 November 2011");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('Y-m-d') == $date2->format('Y-m-d'));
+?>
+--EXPECTF--
+Tue, 17 May 2011 22:14:12 +0000
+Tue, %d %s %d 00:00:00 +0000
+bool(true)
+Fri, 20 May 2011 00:00:00 +0000
+Fri, 20 May 2011 00:00:00 +0000
+bool(true)
+Tue, %d %s %d 00:00:00 +0000
+Tue, %d %s %d 00:00:00 +0000
+bool(true)
+Fri, 25 Nov 2011 00:00:00 +0000
+Fri, 25 Nov 2011 00:00:00 +0000
+bool(true)
+Sat, 19 Nov 2011 00:00:00 +0000
+Sat, 19 Nov 2011 00:00:00 +0000
+bool(true)

Modified: php/php-src/branches/PHP_5_4/ext/date/lib/parse_date.c
===================================================================
--- php/php-src/branches/PHP_5_4/ext/date/lib/parse_date.c	2011-11-26 16:13:39 UTC (rev 319959)
+++ php/php-src/branches/PHP_5_4/ext/date/lib/parse_date.c	2011-11-26 16:44:21 UTC (rev 319960)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Fri Nov 25 16:42:37 2011 */
+/* Generated by re2c 0.13.5 on Sat Nov 26 16:43:35 2011 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
    +----------------------------------------------------------------------+
@@ -24917,8 +24917,19 @@
 		switch (*fptr) {
 			case 'D': /* three letter day */
 			case 'l': /* full day */
-				if (!timelib_lookup_relunit((char **) &ptr)) {
-					add_pbf_error(s, "A textual day could not be found", string, begin);
+				{
+					const timelib_relunit* tmprel = 0;
+
+					tmprel = timelib_lookup_relunit((char **) &ptr);
+					if (!tmprel) {
+						add_pbf_error(s, "A textual day could not be found", string, begin);
+						break;
+					} else {
+						in.time->have_relative = 1;
+						in.time->relative.have_weekday_relative = 1;
+						in.time->relative.weekday = tmprel->multiplier;
+						in.time->relative.weekday_behavior = 1;
+					}
 				}
 				break;
 			case 'd': /* two digit day, with leading zero */
@@ -25001,15 +25012,31 @@
 				}
 				break;
 			case 'i': /* two digit minute, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->i = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit minute could not be found", string, begin);
+				{
+					int length;
+					timelib_sll min;
+
+					TIMELIB_CHECK_NUMBER;
+					min = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (min == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two digit minute could not be found", string, begin);
+					} else {
+						s->time->i = min;
+					}
 				}
 				break;
 			case 's': /* two digit second, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->s = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit second could not be found", string, begin);
+				{
+					int length;
+					timelib_sll sec;
+
+					TIMELIB_CHECK_NUMBER;
+					sec = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (sec == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two second minute could not be found", string, begin);
+					} else {
+						s->time->s = sec;
+					}
 				}
 				break;
 			case 'u': /* up to six digit millisecond */

Modified: php/php-src/branches/PHP_5_4/ext/date/lib/parse_date.re
===================================================================
--- php/php-src/branches/PHP_5_4/ext/date/lib/parse_date.re	2011-11-26 16:13:39 UTC (rev 319959)
+++ php/php-src/branches/PHP_5_4/ext/date/lib/parse_date.re	2011-11-26 16:44:21 UTC (rev 319960)
@@ -1924,8 +1924,19 @@
 		switch (*fptr) {
 			case 'D': /* three letter day */
 			case 'l': /* full day */
-				if (!timelib_lookup_relunit((char **) &ptr)) {
-					add_pbf_error(s, "A textual day could not be found", string, begin);
+				{
+					const timelib_relunit* tmprel = 0;
+
+					tmprel = timelib_lookup_relunit((char **) &ptr);
+					if (!tmprel) {
+						add_pbf_error(s, "A textual day could not be found", string, begin);
+						break;
+					} else {
+						in.time->have_relative = 1;
+						in.time->relative.have_weekday_relative = 1;
+						in.time->relative.weekday = tmprel->multiplier;
+						in.time->relative.weekday_behavior = 1;
+					}
 				}
 				break;
 			case 'd': /* two digit day, with leading zero */
@@ -2008,15 +2019,31 @@
 				}
 				break;
 			case 'i': /* two digit minute, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->i = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit minute could not be found", string, begin);
+				{
+					int length;
+					timelib_sll min;
+
+					TIMELIB_CHECK_NUMBER;
+					min = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (min == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two digit minute could not be found", string, begin);
+					} else {
+						s->time->i = min;
+					}
 				}
 				break;
 			case 's': /* two digit second, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->s = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit second could not be found", string, begin);
+				{
+					int length;
+					timelib_sll sec;
+
+					TIMELIB_CHECK_NUMBER;
+					sec = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (sec == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two second minute could not be found", string, begin);
+					} else {
+						s->time->s = sec;
+					}
 				}
 				break;
 			case 'u': /* up to six digit millisecond */

Added: php/php-src/branches/PHP_5_4/ext/date/tests/bug54851.phpt
===================================================================
--- php/php-src/branches/PHP_5_4/ext/date/tests/bug54851.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_4/ext/date/tests/bug54851.phpt	2011-11-26 16:44:21 UTC (rev 319960)
@@ -0,0 +1,57 @@
+--TEST--
+Bug #54851: DateTime::createFromFormat() doesn't interpret "D".
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$date = new DateTime("2011-05-17T22:14:12");
+$date2 = DateTime::createFromFormat("D H i s", $date->format("D"). ' 0 0 0');
+echo $date->format("r"), "\n";
+echo $date2->format("r"), "\n";
+var_dump($date->format("D") == $date2->format("D"));
+
+// Verify that our implementation works regardless of position
+$datePre = DateTime::createFromFormat("!D d M Y", "Fri 17 may 2011");
+$datePost = DateTime::createFromFormat("!d M Y D", "17 may 2011 Fri");
+echo $datePre->format("r"), "\n";
+echo $datePost->format("r"), "\n";
+var_dump($datePre->format("Y-m-d") == $datePost->format("Y-m-d"));
+
+// Verify that our implementation is the same as for the constructor and
+// strtotime
+$date1 = new DateTime("Tuesday");
+$date2 = DateTime::createFromFormat("D H i s", "Tuesday 0 0 0");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('D') == $date2->format('D'));
+
+// - when the day is not the same as the day on the original date:
+$date1 = DateTime::createFromFormat("!D d M Y", "Fri 19 November 2011");
+$date2 = new DateTime("Fri 19 November 2011");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('Y-m-d') == $date2->format('Y-m-d'));
+
+// - when the day *is* the same as the day on the original date:
+$date1 = DateTime::createFromFormat("!D d M Y", "Sat 19 November 2011");
+$date2 = new DateTime("Sat 19 November 2011");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('Y-m-d') == $date2->format('Y-m-d'));
+?>
+--EXPECTF--
+Tue, 17 May 2011 22:14:12 +0000
+Tue, %d %s %d 00:00:00 +0000
+bool(true)
+Fri, 20 May 2011 00:00:00 +0000
+Fri, 20 May 2011 00:00:00 +0000
+bool(true)
+Tue, %d %s %d 00:00:00 +0000
+Tue, %d %s %d 00:00:00 +0000
+bool(true)
+Fri, 25 Nov 2011 00:00:00 +0000
+Fri, 25 Nov 2011 00:00:00 +0000
+bool(true)
+Sat, 19 Nov 2011 00:00:00 +0000
+Sat, 19 Nov 2011 00:00:00 +0000
+bool(true)

Modified: php/php-src/trunk/ext/date/lib/parse_date.c
===================================================================
--- php/php-src/trunk/ext/date/lib/parse_date.c	2011-11-26 16:13:39 UTC (rev 319959)
+++ php/php-src/trunk/ext/date/lib/parse_date.c	2011-11-26 16:44:21 UTC (rev 319960)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Fri Nov 25 16:42:45 2011 */
+/* Generated by re2c 0.13.5 on Sat Nov 26 10:23:33 2011 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
    +----------------------------------------------------------------------+
@@ -24917,8 +24917,19 @@
 		switch (*fptr) {
 			case 'D': /* three letter day */
 			case 'l': /* full day */
-				if (!timelib_lookup_relunit((char **) &ptr)) {
-					add_pbf_error(s, "A textual day could not be found", string, begin);
+				{
+					const timelib_relunit* tmprel = 0;
+
+					tmprel = timelib_lookup_relunit((char **) &ptr);
+					if (!tmprel) {
+						add_pbf_error(s, "A textual day could not be found", string, begin);
+						break;
+					} else {
+						in.time->have_relative = 1;
+						in.time->relative.have_weekday_relative = 1;
+						in.time->relative.weekday = tmprel->multiplier;
+						in.time->relative.weekday_behavior = 1;
+					}
 				}
 				break;
 			case 'd': /* two digit day, with leading zero */
@@ -25001,15 +25012,31 @@
 				}
 				break;
 			case 'i': /* two digit minute, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->i = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit minute could not be found", string, begin);
+				{
+					int length;
+					timelib_sll min;
+
+					TIMELIB_CHECK_NUMBER;
+					min = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (min == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two digit minute could not be found", string, begin);
+					} else {
+						s->time->i = min;
+					}
 				}
 				break;
 			case 's': /* two digit second, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->s = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit second could not be found", string, begin);
+				{
+					int length;
+					timelib_sll sec;
+
+					TIMELIB_CHECK_NUMBER;
+					sec = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (sec == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two second minute could not be found", string, begin);
+					} else {
+						s->time->s = sec;
+					}
 				}
 				break;
 			case 'u': /* up to six digit millisecond */

Modified: php/php-src/trunk/ext/date/lib/parse_date.re
===================================================================
--- php/php-src/trunk/ext/date/lib/parse_date.re	2011-11-26 16:13:39 UTC (rev 319959)
+++ php/php-src/trunk/ext/date/lib/parse_date.re	2011-11-26 16:44:21 UTC (rev 319960)
@@ -1924,8 +1924,19 @@
 		switch (*fptr) {
 			case 'D': /* three letter day */
 			case 'l': /* full day */
-				if (!timelib_lookup_relunit((char **) &ptr)) {
-					add_pbf_error(s, "A textual day could not be found", string, begin);
+				{
+					const timelib_relunit* tmprel = 0;
+
+					tmprel = timelib_lookup_relunit((char **) &ptr);
+					if (!tmprel) {
+						add_pbf_error(s, "A textual day could not be found", string, begin);
+						break;
+					} else {
+						in.time->have_relative = 1;
+						in.time->relative.have_weekday_relative = 1;
+						in.time->relative.weekday = tmprel->multiplier;
+						in.time->relative.weekday_behavior = 1;
+					}
 				}
 				break;
 			case 'd': /* two digit day, with leading zero */
@@ -2008,15 +2019,31 @@
 				}
 				break;
 			case 'i': /* two digit minute, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->i = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit minute could not be found", string, begin);
+				{
+					int length;
+					timelib_sll min;
+
+					TIMELIB_CHECK_NUMBER;
+					min = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (min == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two digit minute could not be found", string, begin);
+					} else {
+						s->time->i = min;
+					}
 				}
 				break;
 			case 's': /* two digit second, with leading zero */
-				TIMELIB_CHECK_NUMBER;
-				if ((s->time->s = timelib_get_nr((char **) &ptr, 2)) == TIMELIB_UNSET) {
-					add_pbf_error(s, "A two digit second could not be found", string, begin);
+				{
+					int length;
+					timelib_sll sec;
+
+					TIMELIB_CHECK_NUMBER;
+					sec = timelib_get_nr_ex((char **) &ptr, 2, &length);
+					if (sec == TIMELIB_UNSET || length != 2) {
+						add_pbf_error(s, "A two second minute could not be found", string, begin);
+					} else {
+						s->time->s = sec;
+					}
 				}
 				break;
 			case 'u': /* up to six digit millisecond */

Added: php/php-src/trunk/ext/date/tests/bug54851.phpt
===================================================================
--- php/php-src/trunk/ext/date/tests/bug54851.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/date/tests/bug54851.phpt	2011-11-26 16:44:21 UTC (rev 319960)
@@ -0,0 +1,57 @@
+--TEST--
+Bug #54851: DateTime::createFromFormat() doesn't interpret "D".
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$date = new DateTime("2011-05-17T22:14:12");
+$date2 = DateTime::createFromFormat("D H i s", $date->format("D"). ' 0 0 0');
+echo $date->format("r"), "\n";
+echo $date2->format("r"), "\n";
+var_dump($date->format("D") == $date2->format("D"));
+
+// Verify that our implementation works regardless of position
+$datePre = DateTime::createFromFormat("!D d M Y", "Fri 17 may 2011");
+$datePost = DateTime::createFromFormat("!d M Y D", "17 may 2011 Fri");
+echo $datePre->format("r"), "\n";
+echo $datePost->format("r"), "\n";
+var_dump($datePre->format("Y-m-d") == $datePost->format("Y-m-d"));
+
+// Verify that our implementation is the same as for the constructor and
+// strtotime
+$date1 = new DateTime("Tuesday");
+$date2 = DateTime::createFromFormat("D H i s", "Tuesday 0 0 0");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('D') == $date2->format('D'));
+
+// - when the day is not the same as the day on the original date:
+$date1 = DateTime::createFromFormat("!D d M Y", "Fri 19 November 2011");
+$date2 = new DateTime("Fri 19 November 2011");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('Y-m-d') == $date2->format('Y-m-d'));
+
+// - when the day *is* the same as the day on the original date:
+$date1 = DateTime::createFromFormat("!D d M Y", "Sat 19 November 2011");
+$date2 = new DateTime("Sat 19 November 2011");
+echo $date1->format('r'), "\n";
+echo $date2->format('r'), "\n";
+var_dump($date1->format('Y-m-d') == $date2->format('Y-m-d'));
+?>
+--EXPECTF--
+Tue, 17 May 2011 22:14:12 +0000
+Tue, %d %s %d 00:00:00 +0000
+bool(true)
+Fri, 20 May 2011 00:00:00 +0000
+Fri, 20 May 2011 00:00:00 +0000
+bool(true)
+Tue, %d %s %d 00:00:00 +0000
+Tue, %d %s %d 00:00:00 +0000
+bool(true)
+Fri, 25 Nov 2011 00:00:00 +0000
+Fri, 25 Nov 2011 00:00:00 +0000
+bool(true)
+Sat, 19 Nov 2011 00:00:00 +0000
+Sat, 19 Nov 2011 00:00:00 +0000
+bool(true)
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to