上述漏洞修復程序是偉大的,獅子座,謝謝。不幸的是,它仍然在一月份旅行,認爲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