web-dev-qa-db-ja.com

PHPの日付検証

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';`
46
Pablo Lopez

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 ...
}
73

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.';
}

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

51
salathe

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

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

関数はこれからコピーされました answer または 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');
_
27
Joel

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

function isValidDate($date, $format= 'Y-m-d'){
    return $date == date($format, strtotime($date));
}
6
d.raev

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

これを試して、

これは、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}
3
FirmView

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

3
Jared Drake

これを使って:

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;           
}         
3
user2028418

私はこれが古い投稿であることを知っていますが、日付を検証するために次の関数を開発しました:

function IsDateTime($aDateTime) {
    try {
        $fTime = new DateTime($aDateTime);
        $fTime->format('m/d/Y H:i:s');
        return true;
    }
    catch (Exception $e) {
        return false;
    }
}
1
Rich R

これが質問に答えるか、助けになるかはわかりません。

$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"; }
0
Dennis

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

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')、最初のステートメントを取得します。すべてを適切な形式で書いても、間違った日付を入力した場合(XX世紀以前に誰も生まれることはないと想定しました)、コントローラーは2番目のステートメントを送信します。

0
Plusce

これを試して

/^(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

これは(-)文字で日付と日付時刻のすべてのケースをカバーすることに注意してください

0
David Nguyen

誰かに役立つと思う

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;
}
0
Polash Khan