上述漏洞修复程序是伟大的,狮子座,谢谢。不幸的是,它仍然在一月份旅行,认为2014-01与2014-01-01相同---我们是那里的十一分之一。
的日期格式,PHP可以解析,即不包含一个月中某一天的,似乎是(在php_src:date/lib/parse_date.re):
gnudateshorter = year4 "-" month;
datenoday = monthtext ([ .\t-])* year4;
datenodayrev = year4 ([ .\t-])* monthtext;
很少,方便。我们可以在$ dateRaw上运行相同的正则表达式,基本上对解析器决定的内容进行逆向工程。 (侧面观察:上面不包括5/2016这样的格式,它被解析为“5月20日,最后有一些额外的字符”;它们也类似于一年中的一年和一年中的格式,所以我们尽量不要绊倒那些人。)
function date_parse_bugfix($dateRaw) {
$dateRaw = trim($dateRaw);
// Check for just-the-year:
if (strlen($dateRaw) === 4 && preg_match("/\d{4}/", $dateRaw) === 1) {
$da = date_parse($dateRaw . "-01-01");
$da["month"] = false;
$da["day"] = false;
}
else {
$da = date_parse($dateRaw);
if ($da) {
// If we have a suspicious "day 1", check for the three formats above:
if ($da["day"] === 1) {
// Hat tip to http://regex101.com
// We're not actually matching to monthtext (which is looooong),
// just looking for alphabetic characters
if ((preg_match("/^\d{4}\-(0?[0-9]|1[0-2])$/", $dateRaw) === 1) ||
(preg_match("/^[a-zA-Z]+[ .\t-]*\d{4}$/", $dateRaw) === 1) ||
(preg_match("/^\d{4}[ .\t-]*[a-zA-Z]+$/", $dateRaw) === 1)) {
$da["day"] = false;
}
}
}
}
return $da;
}
PHP总是试图返回一个有效的日期,我想这就是它为该索引返回1而不是假的原因。国际海事组织的虚假确实没有任何意义,唯一可以回报的合理价值是1. – vascowhite 2014-11-21 00:52:43
只是年份或年份加上月份仍然是有效的日期。 2010或2010-02是有效的ISO日期,但我现在看到date_parse说2010年是无效的。只是另一个错误。 :-( – Leo 2014-11-21 00:55:11
解决方法是编写你自己的日期解析器,它可以做你想做的事 – Barmar 2014-11-21 00:58:21