3 Stimmen

Wie kann ich in Perl auf ein gültiges Datumsformat überprüfen?

Ich erhalte ein Datumsfeld aus der Datenbank in einer meiner Variablen. Derzeit verwende ich den folgenden Code, um zu überprüfen, ob das Datum im Format "yyyy-mm-dd" vorliegt

if ( $dat =~ /\d{3,}-\d\d-\d\d/ )

Meine Frage lautet, gibt es einen besseren Weg, um dies zu erreichen.

Vielen Dank

0 Stimmen

Wenn die Quelle dieser Daten Ihre Datenbank ist, warum müssen Sie dann das Format überprüfen? Nur aus Neugier.

0 Stimmen

Besser in welcher Hinsicht? Machen Ihnen nicht vorhandene Daten Sorgen? Oder möchten Sie andere Datumsformate zulassen?

0 Stimmen

Was versuchst du eigentlich zu tun? Die Leute haben dir einige vollkommen gültige reguläre Ausdrücke dafür geliefert. Wenn du nur das Format überprüfen möchtest, sind diese im Grunde in Ordnung. Um die Richtigkeit des Datums zu überprüfen, musst du etwas mehr tun. Wenn du tatsächlich die Gültigkeit des Datums überprüfen möchtest, noch mehr. Können wir sicher davon ausgehen, dass die Datenbank dies nicht in einem Datumsfeld speichert und die Daten möglicherweise ungültig sind?

1voto

Igor Punkte 25698

Nun können Sie mit folgendem beginnen:

/\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|30|31)/

0voto

Ich würde DRINGEND DAVON ABRA­TEN, Ihr eigenes reguläres Ausdrucks­muster zu schreiben, um dies zu tun. Die Analyse von Datum und Uhrzeit ist einfach, aber es gibt einige knifflige Aspekte, und dies ist ein Problem, das hunderte Male gelöst wurde. Sie müssen kein weiteres Lösungs­muster entwerfen, schreiben und debuggen.

Wenn Sie ein reguläres Ausdrucks­muster wünschen, ist die beste Lösung wahrscheinlich die Verwendung meines Regexp::Common::time-Plugins für das Regexp::Common-Modul. Sie können einfache oder komplexe, strikte oder flexible Datum-/Uhrzeit­übereinstimmung festlegen, und es verfügt über eine sehr umfangreiche Test­reihe.

Wenn Sie nur bestimmte Datums­formate analysieren möchten, sind Sie möglicherweise besser dran, einen der vielen Analysierungs/Formatierungs-Plugins für Dave Rolskys ausgezeichnetes DateTime-Modul zu verwenden.

Wenn Sie die Datums-/Uhrzeit-Werte validieren möchten, nachdem Sie sie abgeglichen haben, würde ich mein Time::Normalize-Modul vorschlagen.

Hoffe, das hilft.

0voto

Andy A. Punkte 1019

Ich denke, dass die Verwendung eines Regex ohne äußere Überprüfung viel zu kompliziert ist! Ich verwende eine kleine Funktion, um es zu bekommen:

sub check_date {
    my $date_string = shift;

    # Überprüfen Sie das Stringformat und extrahieren Sie Jahr, Monat und Tag daraus.
    # Am besten mit einem Regex.
    return 0 unless $date_string =~ m/^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;

    # 31. in einem Monat mit 30 Tagen
    return 0 if ($3 >= 31 and ($2 == 4 or $2 == 6 or $2  == 9 or $2 == 11));
    # Februar 30. oder 31.
    return 0 if ($3 >= 30 and $2 == 2);
    # Februar 29. in keinem Schaltjahr.
    return 0 if ($2 == 2 and $3 == 29
                 and not ($1 % 4 == 0 and ($1 % 100 != 0 or $1 % 400 == 0)));

    # Datum ist gültig
    return 1;
}

Ich habe die Idee (und den Großteil des Codes) von regular-expressions.info erhalten. Es gibt auch andere Beispiele.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X