82

文字列が PHP を使用して日付/時刻であるかどうかを判断する関数を作成しようとしています。基本的に、有効な日付/時刻は次のようになります。

 2012-06-14 01:46:28

明らかに、完全に動的ですが、値のいずれかが変更される可能性がありますが、常に の形式である必要がありますXXXX-XX-XX XX:XX:XX。このパターンをチェックし、一致した場合に true を返す正規表現を作成するにはどうすればよいですか。

4

17 に答える 17

140

それが文字列全体である場合は、それを解析してみてください。

if (DateTime::createFromFormat('Y-m-d H:i:s', $myString) !== false) {
  // it's a date
}
于 2012-06-14T08:59:25.877 に答える
62

文字列が日付かどうかを確認する最も簡単な方法:

if(strtotime($date_string)){
    // it's in date format
}
于 2017-12-02T12:23:33.017 に答える
42

正規表現を使用しない別のアプローチを次に示します。

function check_your_datetime($x) {
    return (date('Y-m-d H:i:s', strtotime($x)) == $x);
}
于 2012-06-14T09:00:40.690 に答える
5

この関数を PHPfilter_var関数のパラメーターとして使用します。

  • yyyy-mm-dd hh:mm:ss形式の日付をチェックします
  • パターンに一致するが無効な日付 (例: 4 月 31 日) を拒否します。

function filter_mydate($s) {
    if (preg_match('@^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$@', $s, $m) == false) {
        return false;
    }
    if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) {
        return false;
    }
    return $s;
}
于 2012-06-14T08:57:15.170 に答える
3

これには受け入れられた答えがありますが、すべての場合に効果的に機能するわけではありません。たとえば、日付 "10/38/2013" を使用してフォーム フィールドの日付検証をテストすると、有効な DateObject が返されましたが、その日付は PHP 呼び出しで "オーバーフロー" したため、"10/38/ 2013」は「2013/11/07」になります。理にかなっていますが、修正された日付を受け入れるか、ユーザーに正しい日付を入力するように強制する必要がありますか? フォーム検証のナチスである私たちにとって、このダーティフィックスを使用できます: https://stackoverflow.com/a/10120725/486863オブジェクトがこの警告をスローしたときに false を返すだけです。

もう 1 つの回避策は、文字列の日付をフォーマットされたものと一致させ、2 つの値が等しいかどうかを比較することです。これは同じように厄介なようです。しかたがない。これが PHP dev の性質です。

于 2013-10-29T18:41:41.633 に答える
2

ここで答えを見つけましたhttps://stackoverflow.com/a/19271434/1363220、基本的に

$d = DateTime::createFromFormat($format, $date);
// The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
if($d && $d->format($format) === $date) {
    //it's a proper date!
}
else {
    //it's not a proper date
}
于 2020-08-11T20:48:59.503 に答える
1

これには正規表現を使用しませんが、文字列を分割して日付が有効であることを確認するだけです。

list($year, $month, $day, $hour, $minute, $second) = preg_split('%( |-|:)%', $mydatestring);
if(!checkdate($month, $day, $year)) {
     /* print error */
} 
/* check $hour, $minute and $second etc */
于 2012-06-14T08:59:52.237 に答える
0

regEx を使用したい場合は、txt2re.com が常に優れたリソースです。

<?php

  $txt='2012-06-14 01:46:28';
  $re1='((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))';    # Time Stamp 1

  if ($c=preg_match_all ("/".$re1."/is", $txt, $matches))
  {
      $timestamp1=$matches[1][0];
      print "($timestamp1) \n";
  }

?>
于 2012-06-14T09:05:25.900 に答える
0

PHP 5.2 を使用している場合、Joey の回答は機能しません。PHP の DateTime クラスを拡張する必要があります。

class ExDateTime extends DateTime{
    public static function createFromFormat($frmt,$time,$timezone=null){
        $v = explode('.', phpversion());
        if(!$timezone) $timezone = new DateTimeZone(date_default_timezone_get());
        if(((int)$v[0]>=5&&(int)$v[1]>=2&&(int)$v[2]>17)){
            return parent::createFromFormat($frmt,$time,$timezone);
        }
        return new DateTime(date($frmt, strtotime($time)), $timezone);
    }
}

このクラスを問題なく使用できます。

ExDateTime::createFromFormat('d.m.Y G:i',$timevar);
于 2014-10-27T19:59:19.567 に答える
-2

strtotime? リスト?正規表現?

PHP のネイティブ DateTime オブジェクトの何が問題になっていますか?

http://www.php.net/manual/en/datetime.construct.php

于 2012-06-14T09:03:36.117 に答える