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?

6voto

wr. Punkte 2831

Die OWASP Validation Regex Repository Version von Datumsangaben im US-Format mit Unterstützung für Schaltjahre:

^(?:(?:(?:0?[13578]|1[02])(/|-|.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(/|-|.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(/|-|.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(/|-|.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

Die Regular Expression Library enthält eine einfachere Version entlang der anderen Vorschläge, die auf Ihr Problem übersetzt wurde:

^\d{4}-\d{1,2}-\d{1,2}$

4voto

Elbin Punkte 492

Wie von anderen angemerkt, wenn es sich hierbei um ein Datumsfeld aus einer Datenbank handelt, sollte es in einem klar definierten Format kommen, sodass Sie ein einfaches Regex verwenden können, wie das von toolkit.

Aber das hat den Nachteil, dass es ungültige Daten akzeptiert, wie z.B. 2009-02-30. Wenn Sie jedoch Daten verarbeiten, die es erfolgreich in ein datumsbasiertes Feld in einer DB geschafft haben, sollten Sie auf der sicheren Seite sein.

Ein robusterer Ansatz wäre die Verwendung eines der vielen Datum/Uhrzeit-Module von CPAN. Wahrscheinlich wäre Date::Manip eine gute Wahl, insbesondere die Funktion ParseDate().

http://metacpan.org/pod/Date::Manip

0 Stimmen

Time::Piece (im Kern seit 5.10) hat strptime, ebenso POSIX::strptime, Date::Manip (und DateTime) ist für diese Aufgabe etwas überdimensioniert, und die Installation von Date::Manip ist seit Version 6.x, die nur 5.10+ unterstützt, etwas kompliziert, da 5.x-Versionen hinzugefügt wurden.

0 Stimmen

Time::Piece überprüft nicht auf Dinge wie 2009-02-30! eval { my $t = Time::Piece->strptime( '2009-02-30', "%Y-%m-%d" ); };

3voto

toolkit Punkte 48653

Wie wäre es

/\d{2}\d{2}?-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/

2voto

Anonymous Punkte 45953

\\d könnte Ziffernzeichen aus anderen Sprachen entsprechen. Und ist YYY wirklich ein gültiges Jahr? Wenn es vier Ziffern sein muss, ein Bindestrich, zwei Ziffern, ein Bindestrich, zwei Ziffern, würde ich /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/ oder /^[12][0-9]{3}-[0-9]{2}-[0-9]{2}$/ bevorzugen. Achten Sie auf Leerzeichen um den String, den Sie vergleichen.

Natürlich überprüft dies nicht die Sinnhaftigkeit der Zeichen, die dort stehen, außer dem ersten Zeichen im zweiten Beispiel. Wenn dies erforderlich ist, ist es ratsam, es einfach an ein Datumsparsing-Modul zu übergeben und dann die Ausgabe auf logische Ergebnisse zu überprüfen.

2voto

Pradeep Punkte 3044

Die beste und leichte Lösung ist die Verwendung der Date::Calc-Unterfunktion check_date, hier ist ein Beispiel:

use strict;
use warnings
use Date::Calc qw[check_date];

## String im Format JJJJ-MM-TT, Sie können jedes Format haben,
## wie Sie möchten, einfach parsen Sie es
my @dt_dob = unpack("A4xA2xA2",$str_dob_date);

unless(check_date(@dt_dob)) {
    warn "Oops! ungültiges Datum!";
}

Ich hoffe, das war hilfreich :-)

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