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 ValueError
nế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 ValueError
nế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
dateutil
cũ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: dateutil
phâ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 : parse
cũng chấp nhận đối số từ khóa dayfirst
kiể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).
parse
thự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 ValueError
nế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')