【问题标题】:preg_match for mysql date formatmysql 日期格式的 preg_match
【发布时间】:2011-07-05 22:23:06
【问题描述】:

我正在尝试验证日期以查看它是否与 mysql 格式匹配

这是代码

$match = "/^\d{4}-\d{2}-\d{2} [0-2][0-3]:[0-5][0-9]:[0-5][0-9]$/";

    $s = $this->input->post("report_start"). " " . $this->input->post("report_start_time").":00";
    $e = $this->input->post("report_end"). " " . $this->input->post("report_end_time").":59";

    if($this->input->post("action") != "")
    {
        echo trim($s). " => " . preg_match($match, trim($s));
        echo "<br>";
        echo trim($e). " => " . preg_match($match, trim($e));
}

日期格式进入 $s 和 $e 是

$s = 2011-03-01 00:00:00
$e = 2011-03-01 23:59:59

它们都返回 false (0)。

我在 http://www.spaweditor.com/scripts/regex/index.php 上测试了该模式,它返回 true (1)

http://pastebin.com/pFZSKYpj

但是,如果我手动将日期字符串转换为 preg_match 之类的

preg_match($match, "2011-03-01 00:00:00")

它有效。

我不知道我做错了什么

=======================

现在我考虑了一下,我只需要验证 datetime 字符串的 houre:min 部分。

我手动添加秒,日期由日期选择器强制,用户无法编辑它

【问题讨论】:

  • report_start 和 report_end 的具体内容是什么?
  • 我没有使用 strtotime/date,因为如果日期/时间错误我想抛出错误,我不希望它默认为 00:00。这个 sn-p 是一个更大的函数的一部分,它返回给定日期范围之间记录的小时数,默认为 00:00 它会返回错误的小时数
  • var_dump on $s/$e 返回字符串(20)
  • 对于日期时间验证,您可以使用this function。示例:var_dump(validateDate('13:59:59', 'H:i:s'));

标签: php mysql regex string preg-match


【解决方案1】:

好的,这就是我所做的。 因为强制日期格式和时间部分的结束秒数

我刚刚使用"/^2[0-3]|[01][0-9]:[0-5][0-9]$" 验证了小时:迷你部分; 如果返回 true,我将所有内容放在一起结束重建最终的日期时间字符串

    $match = "/^2[0-3]|[01][0-9]:[0-5][0-9]$/";

    $s_d = $this->input->post("report_start");
    $s_t = $this->input->post("report_start_time");
    $e_d = $this->input->post("report_end");
    $e_t = $this->input->post("report_end_time");

    if($this->input->post("action") != "")
    {


        if(
            ( preg_match($match , trim($s_d." ".$s_t.":00")) )
         && ( preg_match($match , trim($e_d." ".$e_t.":59")) )
         )
         {

            $r = $this->model_report->client_hours_logged(array($s,$e));
            $data['report'] = $r;
            var_dump($r);
            //$this->load->view("report/client_hours_per_client",$data);
         }
    }

【讨论】:

    【解决方案2】:

    注意:

    [0-2][0-3] 不是小时值的好正则表达式 - 它将匹配 01、12、23 等,但它会失败 04 到 09 和 14 到 @987654328 @。

    最好改用(2[0-3]|[01][0-9])。

    【讨论】:

    • 这样做 "/^\d{4}-\d{2}-\d{2} 2[0-3]|[01][0-9]:[0-5 ][0-9]:[0-5][0-9]$/" 实际上固定了第一个日期'2011-03-01 00:00:00'
    • 关于这个的问题......显然我的 regx 不好。但我不能检查整个小时。比如说我有 10:20 (h/m)。而不是检查每个字符 1,0 : 2,0 我不能检查 10 和 20 吗?
    【解决方案3】:

    您正在使您的工作更加努力。在 php 中有许多日期处理函数,这意味着您不必将日期视为字符串。因此,与其测试您输入的日期是否采用正确的格式,不如坚持正确的格式:

    $adate= date_create('January 6, 1983 1:30pm'); //date format that you don't want
    $mysqldate= $adate->format("Y-m-d h:i:s");//date format that you do want
    

    还有检查日期是否为真实日期的功能,例如checkdate。

    【讨论】:

    • 当你可以简单地使用函数调用时,不需要创建一个对象,它可能会或可能不会被及时处理。
    • @Unkwntech:我更喜欢使用 DateTime 对象和 DateInterval、DateTimeZone 和 DatePeriod 等辅助工具,因为会自动处理夏令时等常见问题。如果您担心未正确管理未使用的对象,我希望您根本没有使用 OOP。我是。所以多一个对象对我来说没什么不同。
    • 我确实几乎完全使用 OOP,但我也构建了每天响应数百万个请求的应用程序,因此我构建的占用空间尽可能小。这包括当一个简单的(内置)函数调用可以解决问题时不使用对象。我想这只是一个相反的意见。
    【解决方案4】:

    您可以使用strtotime 和date 正确解析和格式化日期。

    【讨论】:

      【解决方案5】:

      为什么不简单地将日期强制转换为您想要的格式:

      $e = '2011-03-01 00:00:00';
      $mysqlFormat = date('Y-m-d H:i:s', strtotime($e));
      

      此外,您的正则表达式 [0-2][0-3]:[0-5][0-9]:[0-5][0-9] 中存在一些错误,它只会匹配 00,01,02,03,10,11,12,13,20,21,22,23 的时间,因此它永远不会匹配凌晨 4 点或下午 3 点等。除此之外,我查看了您的 RegEx,我没有发现它与您提供的测试用例匹配有任何问题。我会检查以确保使用 trim() 的日期字符串的两侧没有多余的空格。

      【讨论】:

      • 我想过这样做。但是他们输入的小时/分钟无效值是什么?说 33:99 不会默认为 00:00 吗?
      • @heshan 实际上它做了一些相当讨厌的事情,我只是用 var_dump(date('Ymd H:i:s', '2001-03-01 33:99:00')) 和它输出字符串(19)“1970-01-01 01:33:21”
      【解决方案6】:

      我同意 Tim 的观点:MySQL 在 quirks 模式下表现,并且总是试图在 DATE 和 DATE_TIME 列类型上变得轻松。您可以省略输入的某些部分,它仍然会尝试补偿并在某种程度上成功实现该目标......这就是为什么,大多数您的 Reg-ex 认为无效的数字,MySQL 将接受为有效。

      【讨论】:

        【解决方案7】:

        我用它来验证 'Y-m-d H:i:s' 格式的日期字符串:

        match = '/^[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-17
          • 2011-10-20
          • 2011-07-19
          • 2013-12-24
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多