当没有日期时,我将其称为 date_parse 中的错误。$d = date_parse("Feb 2010")
会给$d["day"] == 1
.
请参阅对此的评论date_parse 手册页 http://php.net/manual/en/function.date-parse.php#100055.
对于这个问题有什么好的解决方法吗? :-)
UPDATE该日期来自已发表的研究报告。不幸的是,这意味着他们可能会以不同的方式看待。我想在显示参考文献时将它们转换为更标准的 ISO 格式。为了帮助读者,我希望始终只包含给定的字段(年、月、日)。所以这应该是有效的(只给我年份):
2010
这应该是有效的,但只要给我 2010-02 就可以这么说:
Feb 2010
UPDATE 2到目前为止我已经看到两个错误date_parse
。无法解析2010
。它给出了一天,尽管里面没有一天Feb 2010
.
我当然可以为此编写一个修复程序,但肯定有人已经这样做了,或者???
上面的错误修复例程很棒,Leo,谢谢。不幸的是,它仍然在一月份跳闸,认为 2014-01 与 2014-01-01 相同 --- 我们已经完成了十二分之一。
PHP 可以解析的日期格式,即don't包含一个月中的某一天,似乎是(在php_src:日期/lib/parse_date.re https://github.com/php/php-src/blob/250938e2d35fc54161a18167b7901c5e3b574371/ext/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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)