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.
fbuchinger
User
Beiträge: 29
Registriert: Donnerstag 7. September 2006, 21:30

Validierung unterschiedlicher Datumsformate

Beitragvon fbuchinger » Samstag 28. April 2007, 22:31

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=]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[/code]

_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:

Beitragvon EnTeQuAk » Samstag 28. April 2007, 22:41

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

Leider nein...

Beitragvon fbuchinger » Samstag 28. April 2007, 22:57

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:

Beitragvon EnTeQuAk » Samstag 28. April 2007, 23:22

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 28. April 2007, 23:56

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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]