php date_parse ("Feb 2010") 给出 day == 1

标签 php date-parsing

当没有日期时,我称之为 date_parse 中的错误。 $d = date_parse("Feb 2010") 将给出 $d["day"] == 1

请参阅 the date_parse manual page 上对此的评论.

这个问题有什么好的解决方法吗? :-)

更新 日期来自已发表的研究报告。不幸的是,这意味着他们可以以不同的方式看待。我想在显示引用时将它们转换为更标准的 ISO 格式。为了帮助读者,我希望始终只包含给定的字段(年、月、日)。所以这应该是有效的(只给我年份):

2010

这应该是有效的,但只要给我 2010-02 就可以这么说:

Feb 2010

更新 2 到目前为止,我已经在 date_parse 中看到了两个错误。它无法解析 2010。尽管 Feb 2010 没有一天,但它给出了一天。

我当然可以为此编写修复程序,但肯定有人已经这样做了,或者???

最佳答案

上面的错误修复例程很棒,Leo,谢谢。不幸的是,它仍然在一月份旅行,认为 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 这样的格式,它被解析为“20 May,最后有一些额外的字符”;它们也类似于一年中的一天和一年中的一周的格式,所以我们会尽量不被那些绊倒。)

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 date_parse ("Feb 2010") 给出 day == 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27052374/

相关文章:

MySQL 字符串未转换为 .NET 时间

php - 如何将热门帖子限制为持续 6 个月

php - 在将 csv 文件放入 php 数据库时,允许在 csv 文件中的字段中使用逗号

php - object.hashCode使用哪种哈希方法?

java - 如何将不同的日期字符串解析为LocalDate/Year?

java - 在java中解析这种类型的日期格式?

java - 尝试解析日期字符串时出现 ParseException

php - 如何从外部网站连接到 Azure 的数据存储?

PHP 三元运算符

java - Simpledateformat 不可解析的日期