Prüfen Sie mit PHP, ob die Variable ein gültiges Datum ist

Lesezeit: 5 Minuten

Benutzer-Avatar
Alex

Ich arbeite an einem Skript, das einige Daten aus einer CSV-Datei importiert. Während ich dies tue, möchte ich in der Lage sein, eine Variable zu überprüfen, um zu sehen, ob es sich um eine gültige Datumszeichenfolge handelt.

Ich habe mehrere Möglichkeiten gesehen, um zu überprüfen, ob ein Stich ein Datum ist, aber die meisten erfordern, dass Sie das Format kennen. Ich werde das Format des Datums nicht kennen.

Im Moment verwende ich strtotime(), aber das geht nicht so einfach

$field ="May";
if(strtotime($field)){
    echo "This is a date";
}

In diesem Fall war “Mai” der Vorname der Person und überhaupt kein Datum.

Kann jemand eine zuverlässigere Funktion empfehlen?

Bearbeiten Sie basierend auf Fragen von einigen von Ihnen.

Damit eine Variable in meinem Fall als “Datum” durchgeht, müsste sie spezifisch für einen Tag/Monat/Jahr sein, also wäre nur “Mai” zu vage, um sie zu zählen.

Basierend darauf und auf Pauls gutem Punkt unten können wir auch testen, ob die Zeichenfolge eine Zahl enthält, wie z

$field ="May";
if(strtotime($field) && 1 === preg_match('~[0-9]~', $field)){
    echo "This is a date";
}else{
    echo "Nope not a date";
}

Dies scheint meine unmittelbaren Bedürfnisse zu decken, aber kann jemand Probleme erkennen oder Verbesserungen vorschlagen?

  • Wie würde Ihr Skript sagen, ob May war ein Name oder ein Datum?

    – einsamer Tag

    21. Mai 2012 um 20:15 Uhr

  • Du musst geben etwas Spezifikationen, welche Art von Werten Sie akzeptieren. Ansonsten ist “Mai” genauso gut wie jeder andere Wert.

    – JJJ

    21. Mai 2012 um 20:17 Uhr

  • Überprüfen Sie, ob die Person einen Nachnamen hat

    – Jölmob

    21. Mai 2012 um 20:17 Uhr

  • Gibt es überhaupt ein Muster? Erscheinen die Monate sowohl numerisch als auch in einer Zeichenfolge? Sind die Daten in Zellen getrennt, dh Monat in A1, Tag in B2, oder sind sie alle in einer Zelle?

    – Paul Nachtisch

    21. Mai 2012 um 20:24 Uhr

  • @Alex: Nur eine Zahl in der Eingabe abzugleichen, ist alles andere als zufriedenstellend, wie es dauern kann '0May' als gültiges Datum.

    – anubhava

    21. Mai 2012 um 20:38 Uhr

Benutzer-Avatar
Salut

Verwenden date_parse und überprüfen Sie die Werte des zurückgegebenen Arrays

$date = date_parse("May")

// ["year"] == FALSE
// ["month"] == 5
// ["day"] == FALSE

Die kannst du auch weitergeben Prüfdatum.

$date = date_parse($someString);
if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"]))
    echo "Valid date";
else
    echo "Invalid date";

  • Ich denke, du hast es verstanden … Kann irgendjemand irgendwelche Fehler darin sehen?

    – Alex

    21. Mai 2012 um 20:54 Uhr

  • Ein kleiner Schönheitsfehler: date_parse nutzt die strtotime Parsing-Regeln, die sind gut definiert, aber pingelig. Es ist möglich, Daten zu übermitteln, die ein gesetzliches Datum zurückgeben, aber nicht dem Zweck entsprechen.

    – Karl

    21. Mai 2012 um 21:30 Uhr

  • @Charles, ohne dass ein genau definiertes Format für die Eingabe erforderlich ist, hat jeder Algorithmus zum automatischen Analysieren eines Datums Probleme

    – Salat

    21. Mai 2012 um 23:20 Uhr

  • Ich weiß, das ist alt, aber wenn Sie verwendet haben date_parse("2014-01-01 12:00:00'; select * from users;") es wird sagen, dass das Datum gültig ist. Allerdings ist das $date[‘error_count’] wird größer als 0 sein, was eine bessere Option zum Durchlaufen sein könnte. sehen ideone.com/Xl1HTb

    – Joseph

    20. März 2014 um 21:34 Uhr

  • @salut $date["errors"] ist ein Array, also wird es immer falsch sein. Ich denke, was Sie brauchen, ist $date["error_count"]

    – Janis Peisenieks

    8. April 2014 um 10:32 Uhr

Ich glaube nicht, dass es eine All-in-one-Antwort auf dieses Problem gibt. Je nach Anwendungsfall haben Sie möglicherweise eine andere Strategie.

Dein strtotime() ist eine perfekte Lösung, aber wie Sie sagen, können Sie mit einem falschen Positiv enden. Wieso den? Da kann kann ein Wort oder ein Name sein. Was ist jedoch das Ergebnis von strtotime('May')?

echo date(DateTime::ISO8601, strtotime('May'));
2012-05-21T00:00:00+0200

Wenn Sie also nur den Monat angeben, wird ein Datum des aktuellen Jahres und des aktuellen Tages zurückgegeben, beginnend um Mitternacht mit dem angegebenen Monat. Eine mögliche Lösung wäre zu prüfen, ob Ihre Zeichenfolge den aktuellen Tag und/oder das aktuelle Jahr enthält. Auf diese Weise können Sie überprüfen, ob Ihr Datum ein vollständig qualifiziertes Datum und gültig ist.

echo date(DateTime::ISO8601, strtotime('May Day')); // (strtotime() returns false)
1970-01-01T01:00:00+0100

echo date(DateTime::ISO8601, strtotime('May 21'));
2012-05-21T00:00:00+0200

Eine einfache strpos() oder sogar eine Regex sollte den Zweck erfüllen.

Jedoch Es ist etwas seltsam und sollte nur verwendet werden, wenn Sie keine andere Möglichkeit haben.

Ich glaube, dass eine bessere Lösung darin besteht, einen Satz gültiger Formate zu definieren und das Ergebnis zu interpolieren, um sicherzustellen, dass das Datum gültig ist.

$validDateFormatPatterns = array(
 '[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}', // 21-05-2012, obviously this pattern is simple and would accept 05-21-2012,
 'the [0-9]{1,2}(th|st|nd|rd) (January|February|...|May|...|December) [0,9]{4}', // The 21st May 2012
);

Sie sollten versuchen, die meisten Fälle abzudecken, und ich bin sicher, dass Sie in der Lage sein werden, einen regulären Ausdruck zu finden, der nach dem aktuellsten Datumsformat sucht.

In jedem Fall müssen Sie Ihre Funktion möglicherweise von Zeit zu Zeit anpassen, da es keine einfache Möglichkeit gibt, sie kugelsicher zu machen.

Benutzer-Avatar
Bryan

Ich weiß, dass dies vor langer Zeit gefragt wurde, aber als ich mich danach umsah und versuchte, Regex zu vermeiden, kam ich auf Folgendes:

function checkInputIsDate($date) {
    return (bool)strpbrk($date,1234567890) && strtotime($date);
}

Dies funktioniert, weil es die oben geposteten Probleme beseitigt, in denen nur ein Monat vergangen ist strtotime indem Sie sicherstellen, dass Zahlen in der Zeichenfolge mit enthalten sind strpbrk sowie zu verifizieren strtotime gibt ein Datum aus.

Und erfuhr von einer Funktion, von der ich nicht wusste, dass sie existiert.

Hoffe, das hilft jemandem.

1246320cookie-checkPrüfen Sie mit PHP, ob die Variable ein gültiges Datum ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy