Validierung unterschiedlicher Datumsformate

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fbuchinger
User
Beiträge: 29
Registriert: Donnerstag 7. September 2006, 21:30

Hallo,

in meiner Applikation hat der User die Möglichkeit, Daten in verschiedenen Formaten einzugeben. Die Validierung möchte ich von datetime.strptime durchführen lassen. Hier meine Funktion:

Code: Alles auswählen

def _parsedate (datestring):
    dateformats = ['%d.%m.%Y', # like 22.12.2005
                   '%m.%Y,', # like 12.2005
                   '%m.%y,' # like 12.06
                   '%d.%b'] #like 13.Aug
    for format in dateformats:
        try:
            parseddate = datetime.strptime (datestring,format)
        except ValueError:
                continue
        else:
            return parseddate
    return False
_parsedate sollte das vom Benutzer eingegebene Datum mit den erlaubten Datumsformaten der Liste validieren. "Passt" ein Datumsformat nicht, sollte das nächste aus der Liste genommen werden. Sind alle ohne Übereinstimmung durch, müßte die Fkt. False zurückgeben.

Leider funktioniert das nicht - die Schleife wird nur einmal durchlaufen und selbst bei passenden Daten kommt false zurück. Scheinbar beißen sich try/except und while... weiß jemand Rat?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

ungetestet, aber so soltle es eigentlich funktionieren:

Code: Alles auswählen

def _parsedate (datestring):
    dateformats = ['%d.%m.%Y', # like 22.12.2005
                   '%m.%Y,', # like 12.2005
                   '%m.%y,' # like 12.06
                   '%d.%b'] #like 13.Aug
    dform = None
    for format in dateformats:
        try:
            dform = datetime.strptime (datestring,format)
        except ValueError:
                continue
    return dform
So wird `dform` nur gesetzt, wenn wirklich keine Exception aufgerufen wird.

Ich hoffe, das klappt so ;)

MfG EnTeQuAk
fbuchinger
User
Beiträge: 29
Registriert: Donnerstag 7. September 2006, 21:30

Danke für die prompte Antwort, leider klappts damit nicht.

Die Eingabe _parsequery ('12.2005') führt z.B. zu keiner Rückgabe, während _parsequery ('24.12.2005') ein Datumsobjekt zurückgibt (weil dieses Format als erstes in der Liste steht).

LG,

Franz
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Ach, ich trottel...

Sorry... hier is die richtige Version *g*:

Code: Alles auswählen

from datetime import datetime


def _parsedate (datestring):
    dateformats = ['%d.%m.%Y', # like 22.12.2005
                   '%m.%Y', # like 12.2005
                   '%m.%y', # like 12.06
                   '%d.%b'] #like 13.Aug
    dform = None
    for format in dateformats:
        print 'check format: %s' % format
        try:
            dform = datetime.strptime (datestring,format)
        except ValueError:
            continue
    return dform


print _parsedate('12.2006')
print '-------------------'
print _parsedate('22.12.2005')
print '-------------------'
print _parsedate('12.06')
print '-------------------'
print _parsedate('12.Aug')
Der Fehler war eigentlich nicht so schwer zu finden. Du hast die Formate "falsch" definiert. Du hast das Komma, zum trennen der Liste einfach in den Formatstring mit reingesetzt.

Hi Hi ;) wie solch kleine Sachen die Freude vermiesen können.


MFG EnTeQuAk

EDIT: ansonsten funktioniert deine Version oben ebensogut. Nur halt, das du `dateformats` ändern musst *g*
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Ich werfe da noch "parsedatetime" ein. Damit wird die Sache flexibler. http://python.org/pypi/parsedatetime/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten