mirror of
https://github.com/php/php-src.git
synced 2026-04-27 10:16:41 +02:00
- Fixed bug #54851 (DateTime::createFromFormat() doesn't interpret "D").
This commit is contained in:
@@ -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 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim
|
||||
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 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim
|
||||
}
|
||||
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 */
|
||||
|
||||
@@ -1924,8 +1924,19 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim
|
||||
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 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim
|
||||
}
|
||||
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 */
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user