52

PHPの日付検証(MM / DD / YYYY)を設定しようとしていますが、問題が発生しています。これが私が得たもののサンプルです:

$date_regex = '%\A(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d\z%'; 

$test_date = '03/22/2010'; 
if (preg_match($date_regex, $test_date,$_POST['birthday']) ==true) {
    $errors[] = 'user name most have no spaces';`
4

13 に答える 13

90

checkdateを使用できます。たとえば、次のようなものです。

$test_date = '03/22/2010';
$test_arr  = explode('/', $test_date);
if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
    // valid date ...
}

入力を盲目的に信じない、より妄想的なアプローチ:

$test_date = '03/22/2010';
$test_arr  = explode('/', $test_date);
if (count($test_arr) == 3) {
    if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
        // valid date ...
    } else {
        // problem with dates ...
    }
} else {
    // problem with input ...
}
于 2012-08-19T23:35:56.353 に答える
53

クラスのいくつかのメソッドを使用できますDateTime。これは便利な場合があります。つまり、DateTime::createFromFormat()と組み合わせてDateTime::getLastErrors()

$test_date = '03/22/2010';

$date = DateTime::createFromFormat('m/d/Y', $test_date);
$date_errors = DateTime::getLastErrors();
if ($date_errors['warning_count'] + $date_errors['error_count'] > 0) {
    $errors[] = 'Some useful error message goes here.';
}

これにより、日付解析の警告/エラーの実際の原因を確認することもできます(のwarningserrors配列を確認してください$date_errors)。

于 2012-08-19T23:59:22.433 に答える
29

良いですcheckdateが、これは検証するための非常に簡潔な関数のようであり、フォーマットを与えることもできます。[ソース]

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

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


->format()日付が無効であるが、createFromFormatそれでもDateTimeオブジェクトを作成できる場合は、 追加が必要です。例えば:

// Gives "2016-11-10 ..." because Thursday falls on Nov 10
DateTime::createFromFormat('D M j Y', 'Thu Nov 9 2016');

// false, Nov 9 is a Wednesday
validateDate('Thu Nov 9 2016', 'D M j Y');
于 2014-04-08T16:20:09.497 に答える
8

かさばるDateTimeオブジェクトの代わりに..コアのdate()関数を使用するだけです

function isValidDate($date, $format= 'Y-m-d'){
    return $date == date($format, strtotime($date));
}
于 2015-08-10T16:28:37.750 に答える
4

これを使って:

function validate_Date($mydate,$format = 'DD-MM-YYYY') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $mydate);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $mydate);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $mydate);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $mydate);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $mydate);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $mydate);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $mydate);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $mydate);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $mydate);       

    if (is_numeric($year) && is_numeric($month) && is_numeric($day))
        return checkdate($month,$day,$year);
    return false;           
}         
于 2013-01-31T09:02:07.220 に答える
3

ニコラスソリューションが最適です。正規表現が必要な場合は、

これを試して、

これは、1900年1月1日から2099年12月31日までの有効性を検証します。2月31日などの無効な日付に一致しますダッシュ、スペース、スラッシュ、ドットを日付区切り文字として受け入れます

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}
于 2012-08-19T23:40:00.377 に答える
3

正規表現は最後の手段となるはずです。PHPには、検証する関数がいくつかあります。あなたの場合、checkdateが最良のオプションです。http://php.net/manual/en/function.checkdate.php

于 2012-08-19T23:46:05.787 に答える
2

この関数はうまく機能し、

function validateDate($date, $format = 'm/d/Y'){
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) === $date;
}
于 2020-08-20T02:27:31.447 に答える
1

これは古い投稿ですが、日付を検証するために次の関数を開発しました。

function IsDateTime($aDateTime) {
    try {
        $fTime = new DateTime($aDateTime);
        $fTime->format('m/d/Y H:i:s');
        return true;
    }
    catch (Exception $e) {
        return false;
    }
}
于 2014-12-17T18:03:25.097 に答える
1

これを試して

/^(19[0-9]{2}|2[0-9]{3})\-(0[1-9]|1[0-2])\-(0[1-9]|1[0-9]|2[0-9]|3[0-1])((T|\s)(0[0-9]{1}|1[0-9]{1}|2[0-3]{1})\:(0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-9]{1}|4[0-9]{1}|5[0-9]{1})\:(0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-9]{1}|4[0-9]{1}|5[0-9]{1})((\+|\.)[\d+]{4,8})?)?$/

この正規表現は次の場合に有効です。

  • 2017-01-01T00:00:00 + 0000
  • 2017-01-01 00:00:00 + 00:00
  • 2017-01-01T00:00:00 + 00:00
  • 2017-01-01 00:00:00 + 0000
  • 2017-01-01

これは、( -)文字で日付と日時のすべてのケースをカバーすることを忘れないでください

于 2017-06-29T08:25:37.213 に答える
0

これが質問に答えるのか、それとも助けになるのかわからない…。

$dt = '6/26/1970' ; // or // '6.26.1970' ;

$dt = preg_replace("([.]+)", "/", $dt);

$test_arr  = explode('/', $dt);

if (checkdate($test_arr[0], $test_arr[1], $test_arr[2]) && preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}/", $dt))

     { echo(date('Y-m-d', strtotime("$dt")) . "<br>"); }

   else

     { echo "no good...format must be in mm/dd/yyyy"; }
于 2015-05-06T19:36:45.853 に答える
0

以下のような単純な「日付」入力タイプを使用できます。

Birth date: <input type="date" name="userBirthDate" /><br />

次に、DateTimeインターフェイスを組み込み関数'explode'とリンクできます。

public function validateDate()
    {
        $validateFlag = true;
        $convertBirthDate = DateTime::createFromFormat('Y-m-d', $this->birthDate);
        $birthDateErrors = DateTime::getLastErrors();

        if ($birthDateErrors['warning_count'] + $birthDateErrors['error_count'] > 0)
        {
            $_SESSION['wrongDateFormat'] = "The date format is wrong.";
        }

        else
        {
            $testBirthDate = explode('-', $this->birthDate);
            if ($testBirthDate[0] < 1900)
            {
                $validateFlag = false;
                $_SESSION['wrongDateYear'] = "We suspect that you did not born before XX century.";
            }
        }

        return $validateFlag;
    }

Google ChromeとIEでテストしましたが、すべて正しく機能します。さらに、Chromeはシンプルな追加インターフェースを表示します。入力に何も書き込まないか、不正な形式で書き込むと(正しくは、「1919-12-23」の後になります)、最初のステートメントが取得されます。すべてを適切な形式で記述したが、間違った日付を入力した場合(20世紀以前には誰も生まれなかったと思います)、コントローラーは2番目のステートメントを送信します。

于 2017-03-11T19:47:39.257 に答える
0

私はそれが誰かを助けると思います

function isValidDate($thedate) {
    $data = [
        'separators' => array("/", "-", "."),
        'date_array' => '',
        'day_index' => '',
        'year' => '',
        'month' => '',
        'day' => '',
        'status' => false
    ];

    // loop through to break down the date
    foreach ($data['separators'] as $separator) {
        $data['date_array'] = explode($separator, $thedate);
        if (count($data['date_array']) == 3) {
            $data['status'] = true;
            break;
        }
    }

    // err, if more than 4 character or not int
    if ($data['status']) {
        foreach ($data['date_array'] as $value) {
            if (strlen($value) > 4 || !is_numeric($value)) {
                $data['status'] = false;
                break;
            }
        }
    }

    // get the year
    if ($data['status']) {
        if (strlen($data['date_array'][0]) == 4) {
            $data['year'] = $data['date_array'][0];
            $data['day_index'] = 2;
        }elseif (strlen($data['date_array'][2]) == 4) {
            $data['year'] = $data['date_array'][2];
            $data['day_index'] = 0;
        }else {
            $data['status'] = false;
        }
    }

    // get the month
    if ($data['status']) {
        if (strlen($data['date_array'][1]) == 2) {
            $data['month'] = $data['date_array'][1];
        }else {
            $data['status'] = false;
        }
    }

    // get the day
    if ($data['status']) {
        if (strlen($data['date_array'][$data['day_index']]) == 2) {
            $data['day'] = $data['date_array'][$data['day_index']];
        }else {
            $data['status'] = false;
        }
    }

    // finally validate date
    if ($data['status']) {
        return checkdate($data['month'] , $data['day'], $data['year']);
    }

    return false;
}
于 2019-03-11T18:02:11.117 に答える