【问题标题】:Extract multiple date format from few string variables in php从php中的几个字符串变量中提取多个日期格式
【发布时间】:2011-12-07 05:32:34
【问题描述】:

我需要从字符串变量中提取日期,日期格式如下:

$date1 = "03/12/2011 (Sat)";
$date2 = "3.12.2011 SAT";
$date3 = "Date: 03/12/2011 "; /* <-- the extra trailing space is intentional */
$date4 = "date:03/12/2011";
$date5 = "date: 03/12/2011";
$date6 = "03/12/2011";
$date7 = "13.12.2011 TUE";

创建适用于上述所有输入变量以提取正确日期信息的 PHP 函数的最佳方法是什么?

【问题讨论】:

    标签: php date


    【解决方案1】:

    有关函数返回的 DateTime 对象的更多信息,请查看PHP documentation for the DateTime class

    /**
     * Parses date from string
     * @param string $str Uncorrected date string
     * @return DateTime PHP datetime object
     */
    function date_grab($str)
    {
      // regex pattern will match any date formatted dd-mm-yyy or d-mm-yyyy with
      // separators: periods, slahes, dashes
      $p = '{.*?(\d\d?)[\\/\.\-]([\d]{2})[\\/\.\-]([\d]{4}).*}';
      $date = preg_replace($p, '$3-$2-$1', $str);
      return new \DateTime($date);
    }
    
    // verify that it works correctly for your values:
    $arr = array(
      "03/12/2011 (Sat)",
      "3.12.2011 SAT",
      "Date: 03/12/2011 ", /* <-- the extra trailing space is intentional */
      "date:03/12/2011",
      "date: 03/12/2011",
      "03/12/2011"
    );
    
    foreach ($arr as $str) {
      $date = date_grab($str);
      echo $date->format('Y-m-d') . "\n";
    }
    

    【讨论】:

    • 感谢@rdlowrey,但似乎代码中存在一些错误,它仅适用于小于 10 的“day”,例如:“13/12/2011”变为“2011- 12-03" 和 "3.5.2011 THU"-->"2011-05-07"
    • 我将模式更改为 $date = preg_replace('/.*([\d]{2}).([\d]{2}).([\d]{4} ).*/', '$3-$2-$1', $str);现在工作正常:)
    • @Dennis 我刚刚更新了正则表达式模式,对此感到抱歉。我忘了使第一个 * 量词不贪婪。我刚刚测试了答案中的 更正 代码,它现在按预期工作。如果一个月的一天只有一个数字,那么您刚刚在上面评论的正则表达式实际上将不起作用。
    【解决方案2】:

    你可以使用下面的函数,它会匹配你指定的所有变量。

    function extractDates($mydate)
    {
        $date = explode(" ", $mydate);
        $output = $date[0];
        if ($date[0] == "Date:" || $date[0] == "date:")
        {
            $output = $date[1];
        }
    
        return $output;
    }
    
    $date1 = "Date: 03/12/2011";
    echo extractDates($date1);
    

    输出将如您所料:“03/12/2011”。

    您还可以测试所有字符串:

    $date1 = "03/12/2011 (Sat)";
    $date2 = "3.12.2011 SAT";
    $date3 = "Date: 03/12/2011 "; /* <-- the extra trailing space is intentional */
    $date4 = "date:03/12/2011";
    $date5 = "date: 03/12/2011";
    $date6 = "03/12/2011";
    $date7 = "13.12.2011 TUE";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多