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.
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
}
Hier ist ein anderer Ansatz ohne Regex:
function check_your_datetime($x) {
return (date('Y-m-d H:i:s', strtotime($x)) == $x);
}
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
Ich benutze diese Funktion als Parameter für die Funktion PHP filter_var
.
yyyy-mm-dd hh:mm:ss
-Formatfunction 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;
}
Eine kleinere Version könnte helfen:
if(strtotime($date_string)){
// it's in date format
}
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.
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 */
strtotime
? Listen? Reguläre Ausdrücke?
Was ist los mit dem nativen DateTime-Objekt von PHP?
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;
}
}
}
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";
}
?>
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
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);
if (strtotime ($ date)> strtotime (0)) {echo 'es ist ein Datum'}