web-dev-qa-db-ja.com

文字列が日付かどうかを確認する関数

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

 2012-06-14 01:46:28

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

53
Justin

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

if (DateTime::createFromFormat('Y-m-d H:i:s', $myString) !== FALSE) {
  // it's a date
}
94
Joey

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

function check_your_datetime($x) {
    return (date('Y-m-d H:i:s', strtotime($x)) == $x);
}
34
Bjoern

日付の形式がわからない場合:

/**
 * Check if the value is a valid date
 *
 * @param mixed $value
 *
 * @return boolean
 */
function isDate($value) 
{
    if (!$value) {
        return false;
    }

    try {
        new \DateTime($value);
        return true;
    } catch (\Exception $e) {
        return false;
    }
}

var_dump(isDate('2017-01-06')); // true
var_dump(isDate('2017-13-06')); // false
var_dump(isDate('2017-02-06T04:20:33')); // true
var_dump(isDate('2017/02/06')); // true
var_dump(isDate('3.6. 2017')); // true
var_dump(isDate(null)); // false
var_dump(isDate(true)); // false
var_dump(isDate(false)); // false
var_dump(isDate('')); // false
var_dump(isDate(45)); // false
21
John Linhart

小さいバージョン、それは役立つかもしれません:

if(strtotime($date_string)){
    // it's in date format
}
11
Yogesh Mistry

この関数をPHP filter_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;
}
5
Salman A

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

もう1つの回避策は、文字列の日付を書式設定された日付と一致させ、2つの値が等しいかどうかを比較することです。これは同じように厄介なようです。しかたがない。 PHP dev。

3
cj5

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

list($year, $month, $day, $hour, $minute, $second) = preg_split('%( |-|:)%', $mydatestring);
if(!checkdate($month, $day, $year)) {
     /* print error */
} 
/* check $hour, $minute and $second etc */
0
Artefact2

strtotime?リスト?正規表現?

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

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

0
Sherlock

私のプロジェクトでは、これはうまくいくようです:

function isDate($value) {
    if (!$value) {
        return false;
    } else {
        $date = date_parse($value);
        if($date['error_count'] == 0 && $date['warning_count'] == 0){
            return checkdate($date['month'], $date['day'], $date['year']);
        } else {
            return false;
        }
    }
}
0
Gabor

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";
  }

?>
0
PT114
 function validateDate($date, $format = 'Y-m-d H:i:s') 
 {    
     $d = DateTime::createFromFormat($format, $date);    
     return $d && $d->format($format) == $date; 
 } 

関数はこれからコピーされました answer または php.net

0
José Rodrigues

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);
0
MERT DOĞAN

if(strtotime($ date)> strtotime(0)){echo '日付です'}

0
emmanuel