webentwicklung-frage-antwort-db.com.de

Funktion zum Überprüfen, ob eine Zeichenfolge ein Datum ist

Ich versuche, eine Funktion zu schreiben, um festzustellen, ob eine Zeichenfolge ein Datum/eine Uhrzeit mit PHP ist. Grundsätzlich würde ein gültiges Datum bzw. eine gültige Zeit so aussehen:

 2012-06-14 01:46:28

Natürlich kann sich jeder der Werte dynamisch ändern, aber er sollte immer die Form von XXXX-XX-XX XX:XX:XX haben. Wie kann ich einen regulären Ausdruck schreiben, um nach diesem Muster zu suchen und bei Übereinstimmung true zurückgeben.

42
Justin

Wenn das Ihre ganze Zeichenfolge ist, versuchen Sie es einfach zu analysieren:

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

Hier ist ein anderer Ansatz ohne Regex:

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

Falls Sie das Datumsformat nicht kennen:

/**
 * 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
15
John Linhart

Ich benutze diese Funktion als Parameter für die Funktion PHP filter_var

  • Es prüft Datumsangaben im yyyy-mm-dd hh:mm:ss-Format
  • Es lehnt Datumsangaben ab, die dem Muster entsprechen, aber noch ungültig sind (z. B. 31. April)

function filter_mydate($s) {
    if (preg_match('@^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)[email protected]', $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;
}
4
Salman A

Eine kleinere Version könnte helfen:

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

Obwohl dies eine akzeptierte Antwort hat, wird es nicht in allen Fällen effektiv funktionieren. Zum Beispiel teste ich die Datumsüberprüfung für ein Formularfeld, das ich mit dem Datum "10/38/2013" verwendet habe, und ich habe ein gültiges DateObject zurückgegeben. Das Datum war jedoch das, was PHP als "übergelaufen" bezeichnet hat. 10/38/2013 "wird" 07.11.2013 ". Ist sinnvoll, aber sollten wir nur das reformierte Datum akzeptieren oder Benutzer dazu zwingen, das korrekte Datum einzugeben? Für diejenigen unter uns, die Nazis für die Formularüberprüfung verwenden, können wir diesen fehlerhaften Fix verwenden: https://stackoverflow.com/a/10120725/486863 und einfach false zurückgeben, wenn das Objekt diese Warnung auslöst.

Die andere Problemumgehung besteht darin, das String-Datum an das formatierte Datum anzupassen und die beiden für den gleichen Wert zu vergleichen. Das erscheint genauso unordentlich. Naja. Das ist die Natur von PHP dev.

3
cj5

Ich würde kein Regex dafür verwenden, sondern einfach die Zeichenfolge aufteilen und prüfen, ob das Datum gültig ist:

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? Listen? Reguläre Ausdrücke?

Was ist los mit dem nativen DateTime-Objekt von PHP?

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

0
Sherlock

In meinem Projekt scheint das zu funktionieren:

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

Wenn Ihr Herz auf regEx eingestellt ist, ist txt2re.com immer eine gute Ressource:

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

Funktion wurde aus dieser Antwort kopiert oder php.net

0
José Rodrigues

Wenn Sie PHP 5.2 haben, funktioniert Joeys Antwort nicht. Sie müssen die DateTime-Klasse von PHP erweitern:

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

und dann können Sie diese Klasse ohne Probleme verwenden:

ExDateTime::createFromFormat('d.m.Y G:i',$timevar);
0
MERT DOĞAN

if (strtotime ($ date)> strtotime (0)) {echo 'es ist ein Datum'}

0
emmanuel