Seite 1 von 1

Validierung unterschiedlicher Datumsformate

Verfasst: Samstag 28. April 2007, 22:31
von fbuchinger
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?

Verfasst: Samstag 28. April 2007, 22:41
von EnTeQuAk
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

Leider nein...

Verfasst: Samstag 28. April 2007, 22:57
von fbuchinger
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

Verfasst: Samstag 28. April 2007, 23:22
von EnTeQuAk
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*

Verfasst: Samstag 28. April 2007, 23:56
von gerold
Hallo!

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

mfg
Gerold
:-)