ฉันมีวิธีหลามซึ่งยอมรับการป้อนข้อมูลวันที่เป็นสตริง
ฉันจะเพิ่มการตรวจสอบความถูกต้องได้อย่างไรเพื่อให้แน่ใจว่าสตริงวันที่จะถูกส่งผ่านไปยังเมธอดนั้นอยู่ใน ffg รูปแบบ:
'YYYY-MM-DD'
หากไม่เป็นเช่นนั้นเมธอดควรเพิ่มข้อผิดพลาดบางประเภท
ฉันมีวิธีหลามซึ่งยอมรับการป้อนข้อมูลวันที่เป็นสตริง
ฉันจะเพิ่มการตรวจสอบความถูกต้องได้อย่างไรเพื่อให้แน่ใจว่าสตริงวันที่จะถูกส่งผ่านไปยังเมธอดนั้นอยู่ใน ffg รูปแบบ:
'YYYY-MM-DD'
หากไม่เป็นเช่นนั้นเมธอดควรเพิ่มข้อผิดพลาดบางประเภท
คำตอบ:
>>> 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
หลามdateutil
ห้องสมุดถูกออกแบบมาสำหรับการนี้ (และอื่น ๆ ) มันจะแปลงเป็นdatetime
วัตถุให้คุณโดยอัตโนมัติและเพิ่ม a ValueError
หากไม่สามารถทำได้
ตัวอย่างเช่น:
>>> from dateutil.parser import parse
>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)
สิ่งนี้จะเพิ่มValueError
ถ้าหากรูปแบบวันที่ไม่ถูกต้อง:
>>> 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
นอกจากนี้ยังเป็นประโยชน์อย่างยิ่งถ้าคุณเริ่มต้นจำเป็นต้องแยกรูปแบบอื่น ๆ ในอนาคตที่จะสามารถจัดการกับรูปแบบที่เป็นที่รู้จักกันมากที่สุดอย่างชาญฉลาดและช่วยให้คุณสามารถปรับเปลี่ยนข้อกำหนดของคุณ: ตัวอย่างการแยก dateutil
นอกจากนี้ยังจัดการเขตเวลาหากคุณต้องการ
อัปเดตตามความคิดเห็น : parse
ยอมรับอาร์กิวเมนต์ของคำหลักdayfirst
ซึ่งควบคุมว่าคาดว่าวันหรือเดือนนั้นจะมาก่อนหรือไม่หากวันที่ไม่ชัดเจน ค่าเริ่มต้นนี้เป็นเท็จ เช่น
>>> 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 ธันวาคม" แต่parse('11/12/2001')
"12 พฤศจิกายน" (ผลลัพธ์แรกจะแนะนำ "11 ธันวาคม" ที่นี่)
parse
ใช้dayfirst
อาร์กิวเมนต์ของคำหลักที่ช่วยให้คุณสามารถควบคุมสิ่งนี้ได้จริง parse('11/12/2001', dayfirst=True)
จะกลับมา "11 ธันวาคม" ค่าเริ่มต้นของ dateutil คือdayfirst=False
datetutil.parser.parse()
ยอมรับรูปแบบเวลามากเกินไป (คุณสามารถหาตัวอย่างอื่นที่มีการป้อนข้อมูลที่ไม่ชัดเจน) หากคุณต้องการตรวจสอบว่าอินพุตของคุณอยู่ในรูปแบบ YYYY-MM-DD parse()
ฟังก์ชันนั้นเป็นเครื่องมือที่ผิด
.parse()
กลับสตริงรูปแบบนอกเหนือจากdatetime
วัตถุหรือไม่
ฉันคิดว่าฟังก์ชันการตรวจสอบความถูกต้องสมบูรณ์ควรมีลักษณะดังนี้:
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
ดำเนินการเพียง
datetime.strptime(date_text, "%Y-%m-%d")
ไม่เพียงพอเนื่องจากวิธี strptime ไม่ได้ตรวจสอบว่าเดือนและวันที่ของเดือนเป็นเลขทศนิยมที่ไม่มีการเติมเต็ม ตัวอย่างเช่น
datetime.strptime("2016-5-3", '%Y-%m-%d')
จะถูกดำเนินการโดยไม่มีข้อผิดพลาด
datetime.strptime(date_text, "%Y-%m-%d")
หรือไม่?
from datetime import datetime
datetime.strptime(date_string, "%Y-%m-%d")
.. นี่จะเพิ่มValueError
ถ้ามันได้รับรูปแบบที่เข้ากันไม่ได้
.. หากคุณกำลังจัดการกับวันที่และเวลามาก (ในแง่ของวัตถุ datetime เมื่อเทียบกับ unix timestamp floats) คุณควรตรวจสอบโมดูล pytz และเก็บ / db เก็บทุกอย่างใน UTC .
นี่เป็นวิธีที่ง่ายที่สุด:
date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')