Tôi có một phương thức python chấp nhận đầu vào ngày dưới dạng chuỗi .
Làm cách nào để thêm xác thực để đảm bảo chuỗi ngày được truyền cho phương thức nằm trong ffg. định dạng:
'YYYY-MM-DD'
nếu không, phương thức sẽ đưa ra một số lỗi
Tôi có một phương thức python chấp nhận đầu vào ngày dưới dạng chuỗi .
Làm cách nào để thêm xác thực để đảm bảo chuỗi ngày được truyền cho phương thức nằm trong ffg. định dạng:
'YYYY-MM-DD'
nếu không, phương thức sẽ đưa ra một số lỗi
Câu trả lời:
>>> 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
Các Pythondateutil thư viện được thiết kế cho việc này (và nhiều hơn nữa). Nó sẽ tự động chuyển đổi nó thành một datetimeđối tượng cho bạn và nâng cao ValueErrornếu nó không thể.
Ví dụ:
>>> from dateutil.parser import parse
>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)
Điều này sẽ tăng ValueErrornếu ngày không được định dạng chính xác:
>>> 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
dateutilcũng cực kỳ hữu ích nếu bạn bắt đầu cần phân tích các định dạng khác trong tương lai, vì nó có thể xử lý hầu hết các định dạng đã biết một cách thông minh và cho phép bạn sửa đổi đặc tả của mình: dateutilphân tích ví dụ .
Nó cũng xử lý các múi giờ nếu bạn cần điều đó.
Cập nhật dựa trên nhận xét : parsecũng chấp nhận đối số từ khóa dayfirstkiểm soát xem ngày hoặc tháng dự kiến sẽ đến trước nếu ngày không rõ ràng. Điều này mặc định là Sai. Ví dụ
>>> 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/12" nhưng parse('11/12/2001')là "12/11" (kết quả đầu tiên sẽ gợi ý "11/12" tại đây).
parsethực sự có một dayfirstđối số từ khóa cho phép bạn kiểm soát điều này. parse('11/12/2001', dayfirst=True)sẽ trở lại "ngày 11 tháng 12" Mặc định của dateutil làdayfirst=False
datetutil.parser.parse()chấp nhận quá nhiều định dạng thời gian (bạn có thể tìm thấy các ví dụ khác với đầu vào mơ hồ). Nếu bạn muốn xác thực rằng đầu vào của bạn ở định dạng YYYY-MM-DD thì parse()chức năng là công cụ sai.
.parse()trả về chuỗi định dạng ngoài datetimeđối tượng không?
Tôi nghĩ rằng chức năng xác nhận đầy đủ sẽ trông như thế này:
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
Chỉ thực hiện
datetime.strptime(date_text, "%Y-%m-%d")
là không đủ vì phương pháp strptime không kiểm tra xem tháng và ngày trong tháng có phải là số thập phân có đệm không. Ví dụ
datetime.strptime("2016-5-3", '%Y-%m-%d')
sẽ được thực hiện mà không có lỗi.
datetime.strptime(date_text, "%Y-%m-%d")không?
from datetime import datetime
datetime.strptime(date_string, "%Y-%m-%d")
.. điều này làm tăng ValueErrornếu nó nhận được một định dạng không tương thích.
.. nếu bạn đang xử lý ngày và giờ rất nhiều (theo nghĩa của các đối tượng datetime, trái ngược với dấu phẩy dấu thời gian unix), bạn nên xem xét mô-đun pytz và để lưu trữ / db, lưu trữ mọi thứ trong UTC .
Đây là cách dễ dàng nhất:
date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')