it-swarm.com.de

Wie überprüfe ich ein Datumszeichenfolgenformat in Python?

Ich habe eine python -Methode, die eine Datumseingabe als Zeichenfolge akzeptiert.

Wie füge ich eine Validierung hinzu, um sicherzustellen, dass die an die Methode übergebene Datumszeichenfolge in der ffg enthalten ist. Format:

'YYYY-MM-DD'

ist dies nicht der Fall, sollte die Methode einen Fehler auslösen

112
codemickeycode
>>> import datetime
>>> def validate(date_text):
    try:
        datetime.datetime.strptime(date_text, '%Y-%m-%d')
    except ValueError:
        raise ValueError("Incorrect data format, should be YYYY-MM-DD")


>>> validate('2003-12-23')
>>> validate('2003-12-32')

Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    validate('2003-12-32')
  File "<pyshell#18>", line 5, in validate
    raise ValueError("Incorrect data format, should be YYYY-MM-DD")
ValueError: Incorrect data format, should be YYYY-MM-DD
176
jamylak

Die Python dateutil -Bibliothek wurde für diese und weitere Zwecke entwickelt. Dies wird automatisch in ein datetime Objekt konvertiert und ein ValueError ausgelöst, wenn dies nicht möglich ist.

Als Beispiel:

>>> from dateutil.parser import parse
>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)

Dies löst ein ValueError aus, wenn das Datum nicht korrekt formatiert ist:

>>> parse("2003-09-251")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 720, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 317, in parse
    ret = default.replace(**repl)
ValueError: day is out of range for month

dateutil ist auch äußerst nützlich, wenn Sie in Zukunft andere Formate analysieren müssen, da es die meisten bekannten Formate intelligent verarbeiten kann und Sie Ihre Spezifikation ändern können: dateutil Parsing-Beispiele .

Es behandelt auch Zeitzonen, wenn Sie das brauchen.

Aktualisierung basierend auf Kommentaren : parse akzeptiert auch das Schlüsselwortargument dayfirst, das steuert, ob der Tag oder der Monat erwartet wird Komm zuerst, wenn ein Datum nicht eindeutig ist. Der Standardwert ist False. Z.B.

>>> parse('11/12/2001')
>>> datetime.datetime(2001, 11, 12, 0, 0) # Nov 12
>>> parse('11/12/2001', dayfirst=True)
>>> datetime.datetime(2001, 12, 11, 0, 0) # Dec 11
55
Jacinda

Ich denke, die vollständige Validierungsfunktion sollte so aussehen:

from datetime import datetime

def validate(date_text):
    try:
        if date_text != datetime.strptime(date_text, "%Y-%m-%d").strftime('%Y-%m-%d'):
            raise ValueError
        return True
    except ValueError:
        return False

Nur ausführen

datetime.strptime(date_text, "%Y-%m-%d") 

ist nicht genug, da die strptime-Methode nicht überprüft, ob Monat und Tag des Monats mit Nullen aufgefüllte Dezimalzahlen sind. Zum Beispiel

datetime.strptime("2016-5-3", '%Y-%m-%d')

wird fehlerfrei ausgeführt.

22
Eduard Stepanov
from datetime import datetime

datetime.strptime(date_string, "%Y-%m-%d")

..dieses löst ein ValueError aus, wenn es ein inkompatibles Format empfängt.

..wenn Sie häufig mit Datums- und Uhrzeitangaben zu tun haben (im Sinne von Datetime-Objekten im Gegensatz zu Unix-Timestamp-Floats), sollten Sie sich das pytz-Modul ansehen und für storage/db alles in UTC speichern .

16
Mr. B