【问题标题】:Verifying Date/Time Input in PHP在 PHP 中验证日期/时间输入
【发布时间】:2012-10-28 20:27:15
【问题描述】:

PHP 编程新手。尝试验证日期/时间的输入格式。用户输入如下 2012 年 11 月 27 日下午 6 点“2012-nov-27|6pm”。

不确定从哪里开始。有什么建议?谢谢。

【问题讨论】:

  • 嘿,2012 年 11 月 27 日下午 6 点和“2012-nov-27|6pm”中的哪一个是您的输入,哪一个是您的输出?
  • '2012-nov-27|6pm' 是输入
  • 好吧,当你说“验证输入格式”时,我不确定你到底想要什么,但要打破它,你可以这样做:$input = '2012-nov-27|6pm '; $datetime = explode('|', $input); $time = $datetime[1]; $输入 = $日期时间[0]; $date=explode('-', $input); $年 = $日期[0]; $mth = $日期[1]; $day = $date[2];

标签: php date format verify


【解决方案1】:

你可以使用checkdate:

if(checkdate($month, $day, $year)){
    echo 'Valid date!';
}

或者,您可以转换用户使用 strtotime() 输入的任何内容。如果 strtotime 无法确定日期,则返回 bool false。

if(strtotime($dateEntered) !== false){
     echo 'Valid date!';
}

【讨论】:

    【解决方案2】:

    如果您只想检查格式,请使用正则表达式:

    $months = 'jan|feb|mar|apr|may|jun|jul|aug|sep|okt|nov|dec';
    $pattern = '/([0-9]{4})-('.$months.')-([0-9]{2})\\|([0-9]?[0-9])(am|pm)/';
    preg_match($pattern, $input, $matches);
    var_dump($matches);
    

    如果您真的想检查特定日期/时间是否存在,事情会变得更加复杂。我可能错了,但我不认为可以使用 PHP 日期函数来完成,因为它们对输入错误非常宽容。也许有一个图书馆可以做到这一点。

    【讨论】:

    • 这是一个很好的尝试,但是它确实会留下一些错误。因为月份部分允许 a-z 日期可以是任意随机的 3 个字母并且仍然通过。
    • 如果我用它来检查输入是否正确,我可以使用单独的日期函数如 checkdate() 来确保日期的有效性吗?
    • 已编辑。我将其拆分为变量以使其在此处更具可读性。随意再次内联它们。我还添加了括号,以便您在之后获得 $matches 中的不同部分以进一步检查它们。我不能对此给出任何建议,因为日期不是 PHP 的强项。
    • 这将匹配0000-jan-99|99am 作为有效日期。您可以使用正则表达式验证日期,但这绝非易事(您将如何处理闰年?)。检查有效日期的最简单/更快的方法是DateTime::createFromFormat()date_create_from_format(),如果您更喜欢程序的话。
    • 如果您这么认为,请运行DateTime::createFromFormat('Y-m-d H:i:s', '0000-01-99 99:00:00') 并感到惊讶。 ;)
    【解决方案3】:

    查看here 了解 date_parse_from_format 文档和here 了解一般日期格式。试试这个:

    <?php
    $date = "2012-nov-27|6pm";
    print_r(date_parse_from_format("Y-M-d|ga", $date));
    ?>
    

    【讨论】:

    • 你知道为什么我在结果数组中得到一个错误(Unexpected data found.)吗?如果我将 | 替换为 [space],则不会发生这种情况。
    【解决方案4】:

    试试:

    $datetime = "2012-nov-27|6pm";
    $unixtime = strtotime( $datetime );
    if( is_numeric($unixtime) && $unixtime <= PHP_INT_MAX ) {
      //do something if true
     } else {
        echo "Invalid DateTime";
     }
    

    Demo

    【讨论】:

    • $date_time 在这种情况下如何成为 DateTime 的实例?不就是一个字符串吗?
    • 因此,在这种情况下,它将评估为 false
    • 它总是评估为假。这只是一个字符串!无论字符串内容是什么,它都是错误的。
    • 如果输入日期包含|,似乎strtotime() 总是返回false。如果您改为使用[space],则不会发生这种情况。
    • 是的,OP没有提到,如果他/她想删除|,所以我假设他/她想保留它。
    【解决方案5】:

    如果您只是想测试您的日期是否有效,以下方法将起作用。即使您只是想测试输入格式,我建议您也对数据进行健全性检查。

    $thedate = "2012-nov-27|6pm";
    
    $arryParts = explode("|", $thedate);
    
    $arryDate = date_parse($arryParts[0]);
    if(!checkdate($arryDate['month'], $arryDate['day'], $arryDate['year'])) {
       /* error handling */
    }
    
    /* valid date, continue processing */
    

    【讨论】:

      【解决方案6】:

      江南 OOP风格:

      $input = '2012-nov-27|6pm';
      $date  = \DateTime::createFromFormat('Y-M-j ga', str_replace('|', ' ', $input));
      if ($date === false) {
          throw new \Exception('Invalid date!');
      }
      

      注意:我在格式/日期字符串中使用| 时遇到了问题,因此str_replace()

      注意 2:如果输入日期格式是 01-31 而不是 1-31,请将 createFromFormat() 第一个参数中的 j 替换为 d

      【讨论】:

      • 我相信你的意思是 OOP 江南 Style。 ROFL 手感不错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多