Dize olarak bir tarih girişi kabul eden bir python yöntemi var .
Yönteme iletilen tarih dizesinin ffg'de olduğundan emin olmak için nasıl doğrulama ekleyebilirim? biçim:
'YYYY-MM-DD'
değilse, yöntem bir tür hata ortaya çıkarmalıdır
Dize olarak bir tarih girişi kabul eden bir python yöntemi var .
Yönteme iletilen tarih dizesinin ffg'de olduğundan emin olmak için nasıl doğrulama ekleyebilirim? biçim:
'YYYY-MM-DD'
değilse, yöntem bir tür hata ortaya çıkarmalıdır
Yanıtlar:
>>> 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
Pythondateutil
kitaplığı (ve daha fazla) Bunun için tasarlanmıştır. Bunu datetime
sizin için otomatik olarak bir nesneye dönüştürür ve ValueError
yapamazsa yükseltir .
Örnek olarak:
>>> from dateutil.parser import parse
>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)
Bu yükseltir ValueError
tarih biçimi doğru değil ise:
>>> 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
Ayrıca, bilinen diğer biçimleri akıllıca işleyebildiğinden ve belirtimlerinizi değiştirmenize izin verdiğinden, gelecekte diğer biçimleri ayrıştırmaya ihtiyaç duyuyorsanız son derece kullanışlıdır: dateutil
örnekleri ayrıştırma .
İhtiyacınız olursa zaman dilimlerini de işler.
Yorumlara dayalı güncelleme : parse
ayrıca, dayfirst
bir tarih belirsizse gün veya ayın önce gelip gelmeyeceğini kontrol eden anahtar kelime argümanını da kabul eder . Bu varsayılan olarak Yanlış seçeneğidir. Örneğin
>>> 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
parse('13/12/2001')
"13 Aralık" ama parse('11/12/2001')
"12 Kasım" (ilk sonuç burada "11 Aralık" ı önerir).
parse
aslında dayfirst
bunu kontrol etmenizi sağlayan bir anahtar kelime argümanı alır . parse('11/12/2001', dayfirst=True)
"11 Ara" dönecektir. dateutil'in varsayılan değeridayfirst=False
datetutil.parser.parse()
çok fazla zaman biçimini kabul eden noktayı kaçırıyorsunuz (belirsiz girişe sahip başka örnekler bulabilirsiniz). Girişinizin YYYY-AA-GG biçiminde olduğunu doğrulamak istiyorsanız , parse()
işlev yanlış araçtır.
.parse()
ek olarak biçim dizesini döndürmenin bir yolu var mı datetime
?
Bence tam validate fonksiyonu şöyle görünmeli:
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
Sadece yürütmek
datetime.strptime(date_text, "%Y-%m-%d")
strptime yöntemi ayın ve ayın sıfır basamaklı ondalık sayı olup olmadığını kontrol etmediği için yeterli değildir. Örneğin
datetime.strptime("2016-5-3", '%Y-%m-%d')
hatasız yürütülecektir.
datetime.strptime(date_text, "%Y-%m-%d")
mı?
from datetime import datetime
datetime.strptime(date_string, "%Y-%m-%d")
.. bu, ValueError
uyumsuz bir biçim alırsa a'yı yükseltir .
.. tarihler ve saatler ile çok uğraşıyorsanız (unix zaman damgası yüzerlerinin aksine tarih-saat nesneleri anlamında), pytz modülüne bakmak ve depolama / db için her şeyi UTC'de saklamak iyi bir fikirdir. .
Bu en kolay yol:
date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')