webentwicklung-frage-antwort-db.com.de

php date validierung

Ich versuche, eine PHP-Datumsüberprüfung (MM/TT/JJJJ) einzurichten, habe aber Probleme. Hier ist ein Beispiel von dem, was ich bekam:

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

Sie könnten checkdate verwenden. Zum Beispiel so etwas:

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

Ein paranoider Ansatz, der der Eingabe nicht blind glaubt:

$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 ...
}
69
Nicolás

Sie können einige Methoden der DateTime -Klasse verwenden, was praktisch sein kann; nämlich DateTime::createFromFormat() in Verbindung mit 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.';
}

Auf diese Weise können wir sogar sehen, was die Datumsanalyse der Warnungen/Fehler tatsächlich verursacht hat (siehe warnings und errors in $date_errors).

49
salathe

Obwohl checkdate gut ist, scheint dies eine sehr prägnante Funktion zu sein, und Sie können auch Formate angeben. [ Quelle ]

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

Funktion wurde aus dieser Antwort kopiert oder php.net


Das zusätzliche ->format() wird für Fälle benötigt, in denen das Datum ungültig ist, createFromFormat jedoch immer noch ein DateTime-Objekt erstellt. Zum Beispiel:

// 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');
25
Joel

Anstelle des sperrigen DateTime object .. verwenden Sie einfach die core date () Funktion

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

Nicolas Lösung ist am besten. Wenn Sie in Regex wollen,

versuche dies,

dies gilt für, 01/01/1900 bis 31/12/2099. Entspricht ungültigen Datumsangaben wie dem 31. Februar. Akzeptiert Bindestriche, Leerzeichen, Schrägstriche und Punkte als Datumstrennzeichen

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}
3
FirmView

REGEX sollte ein letzter Ausweg sein. PHP hat einige Funktionen, die für Sie validiert werden. In Ihrem Fall ist checkdate die beste Option. http://php.net/manual/de/function.checkdate.php

3
Jared Drake

Benutze es:

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

Ich weiß, dass dies ein älterer Post ist, aber ich habe die folgende Funktion zur Validierung eines Datums entwickelt:

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

Nicht sicher, ob dies die Frage beantwortet oder helfen wird ....

$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

Wir können den einfachen Eingabetyp "Datum" wie folgt verwenden:

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

Dann können wir die DateTime-Schnittstelle mit der eingebauten Funktion 'explode' verknüpfen:

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

Ich habe es bei Google Chrome und IE getestet, alles funktioniert einwandfrei. Darüber hinaus bietet Chrome eine einfache zusätzliche Benutzeroberfläche. Wenn Sie nichts in Eingabe schreiben oder es in einem fehlerhaften Format schreiben (richtig folgt: '1919-12-23'), erhalten Sie die erste Anweisung. Wenn Sie alles in gutem Format schreiben, aber ein falsches Datum eingeben (ich nahm an, dass vor dem 20. Jahrhundert niemand geboren werden konnte), sendet Ihr Controller die zweite Anweisung.

0
Plusce

Versuche dies

/^(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})?)?$/

dieser reguläre Ausdruck gilt für:

  • 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

Denken Sie daran, dass dies alle Datums- und Datumsangaben mit ( - ) Zeichen abdeckt

0
David Nguyen

Ich denke, es wird jemandem helfen.

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