2016-09-16 29 views
10

Theo định dạng tôi được cung cấp, ngày 2014-01-02 sẽ được đại diện bởi "20140102". Đây được phân tách một cách chính xác với strptime tiêu chuẩn:Tại sao datetime.datetime.strptime của python ('201412', '% Y% m% d') không tăng giá trị ValueError?

>>> datetime.datetime.strptime("20140102", "%Y%m%d") 
datetime.datetime(2014, 1, 2, 0, 0) 

Trong định dạng này, "201.412" sẽ không là một ngày hợp lệ. Số docs nói rằng chỉ thị "% m" là "Tháng dưới dạng số thập phân không có đệm". Nó đưa ra các ví dụ "01, 02, ..., 12". Chỉ thị ngày "% d" cũng được cho là không có đệm.

Dựa trên điều này, tôi hy vọng rằng "201412" sẽ là đầu vào không hợp lệ với định dạng này, vì vậy sẽ tăng giá trị ValueError. Thay vào đó, nó được hiểu là 2014-01-02:

>>> datetime.datetime.strptime("201412", "%Y%m%d") 
datetime.datetime(2014, 1, 2, 0, 0) 

Câu hỏi đặt ra là: có cách nào để chỉ định "không có chỉ đệm không nghiêm trọng" không? Hay tôi hiểu nhầm cụm từ "không độn" trong ngữ cảnh này?

Lưu ý rằng câu hỏi không phải là về cách phân tích cú pháp các ngày theo định dạng này, nhưng về sự hiểu biết về hành vi của strptime.

+0

này không thực sự giúp bạn, nhưng nó là phần nào liên quan (nghĩ '/ 'lĩnh vực tách) [Phân tích khác không dấu thời gian đệm trong python] (http://stackoverflow.com/ question/25279993/parsing-non-zero-độn-timestamps-in-python) – metatoaster

+0

tôi nghĩ rằng nó phụ thuộc vào biểu thức chính quy, hàm sử dụng – kiviak

+0

Dường như một số giải thích bổ sung trong tài liệu Python sẽ là tốt đẹp. Có đảm bảo rằng 'strptime (" 2014123 ","% Y% m% d ")' sẽ luôn cung cấp 'datetime (2014, 12, 3, 0, 0)' hoặc có thể là 'datetime (2014, 1, 23, 0, 0) '? – Matthias

Trả lời

5

Theo liên quan issue trên tracker Python, có ví dụ là như vậy (một ít sửa đổi cho câu hỏi này, nhưng khái niệm này là chính xác giống nhau):

>>> datetime.datetime.strptime('20141110', '%Y%m%d').isoformat() 
'2014-11-10T00:00:00' 
>>> datetime.datetime.strptime('20141110', '%Y%m%d%H%M').isoformat() 
'2014-01-01T01:00:00' 

Các hành vi trên là được xác định là không phải là lỗi được giải thích bởi this comment tuyên bố rằng chúng tuân theo OpenGroup strptime standard chỉ định rằng "số 0 đứng đầu được phép nhưng không bắt buộc".

Tôi đoán cách giải quyết là sử dụng regex hoặc kiểm tra độ dài của chuỗi có độ dài là 8 trước khi đi qua strptime.

1

Điều này khá phức tạp, nhưng có vẻ như strptime chỉ cố gắng khớp chuỗi càng chặt càng tốt. Mã số strptime của Python giống với số strptime của C và tài liệu nói rằng đệm là tùy chọn:

là số tháng [1,12]; số 0 đứng đầu được phép nhưng không được yêu cầu .

http://pubs.opengroup.org/onlinepubs/7908799/xsh/strptime.html

Các vấn đề liên quan