Chỉ trong trường hợp câu trả lời này giúp ích cho người khác - tôi đến đây nghĩ rằng tôi đã gặp vấn đề với không đệm, nhưng thực tế là liên quan đến 12:00 so với 00:00 và bộ %Iđịnh dạng.
Bộ %Iđịnh dạng có nghĩa là phù hợp với 12 giờ đồng hồ, tùy chọn không đệm. Nhưng tùy thuộc vào nguồn dữ liệu của bạn, bạn có thể nhận được dữ liệu cho biết rằng nửa đêm hoặc giữa trưa thực sự bằng 0, ví dụ:
>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'
Điều strptimethực sự muốn là số 12, không phải số 0:
>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)
Nhưng không phải lúc nào chúng ta cũng kiểm soát được nguồn dữ liệu của mình! Giải pháp của tôi cho trường hợp cạnh này là bắt ngoại lệ, thử phân tích cú pháp nó bằng a %H, kiểm tra nhanh xem chúng tôi đang ở trong trường hợp cạnh mà chúng tôi nghĩ rằng chúng tôi đang ở trong đó.
def get_datetime(string):
try:
timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
except ValueError:
timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
assert string.lower().endswith('am')
assert timestamp.hour == 0
return timestamp
0:12amlà đầu vào không hợp lệ. Nó nên được12:12am.11:59 pmđược theo sau bởi12:00 am, không0:00am. Có thể có nhiều cách để cung cấp dữ liệu sai định dạng thời gian, ví dụ: đầu vào có thể sử dụng năm (%y) hai chữ số thay vì năm bốn chữ số (%Y) hoặc ngày / tháng có thể được hoán đổi (%m/%dso với%d/%m), v.v. Ngày / trường hợp tháng có thể không rõ ràng, ví dụ,2015/10/12đó là "ngày 12 tháng 10" hay "ngày 10 tháng 12"? btw, bạn nên sử dụng%Y/%m/%dthay vì%m/%d/%Yđể khớp với định dạng đầu vào của bạn.