2012-03-01 42 views
37

tôi có một hệ thống (được phát triển bằng Python) chấp nhận datetime như chuỗi trong định dạng khác nhau và tôi phải phân tích cú pháp định dạng chuỗi them..Currently datetime là:Phân tích datetime trong Python ..?

Fri Sep 25 18:09:49 -0500 2009 

2008-06-29T00:42:18.000Z 

2011-07-16T21:46:39Z 

1294989360 

Bây giờ tôi muốn có một chung trình phân tích cú pháp có thể chuyển đổi bất kỳ định dạng datetime nào trong đối tượng ngày giờ phù hợp ...

Nếu không, tôi phải phân tích cú pháp riêng lẻ. Vì vậy, vui lòng cung cấp phương pháp phân tích cú pháp riêng lẻ (nếu không có trình phân tích cú pháp chung) .. !!

Trả lời

52

Như @TimPietzcker gợi ý, gói dateutil là con đường để đi, nó xử lý 3 định dạng đầu tiên một cách chính xác và tự động:

>>> from dateutil.parser import parse 
>>> parse("Fri Sep 25 18:09:49 -0500 2009") 
datetime.datetime(2009, 9, 25, 18, 9, 49, tzinfo=tzoffset(None, -18000)) 
>>> parse("2008-06-29T00:42:18.000Z") 
datetime.datetime(2008, 6, 29, 0, 42, 18, tzinfo=tzutc()) 
>>> parse("2011-07-16T21:46:39Z") 
datetime.datetime(2011, 7, 16, 21, 46, 39, tzinfo=tzutc()) 

Định dạng unixtime nó có vẻ miệt vườn lên trên, nhưng may mắn là các tiêu chuẩn datetime.datetime được đề cử cho nhiệm vụ:

>>> from datetime import datetime 
>>> datetime.utcfromtimestamp(float("1294989360")) 
datetime.datetime(2011, 1, 14, 7, 16) 

Nó là khá dễ dàng để thực hiện một chức năng trong số này để xử lý tất cả 4 định dạng:

from dateutil.parser import parse 
from datetime import datetime 

def parse_time(s): 
    try: 
     ret = parse(s) 
    except ValueError: 
     ret = datetime.utcfromtimestamp(s) 
    return ret 
+0

thực sự đây là những gì tôi đã làm, khi @TimPietzcker đề nghị ... u có thể thấy rằng trong bình luận .. !! .. nhưng thanx cho trả lời tuyệt vời (và mô tả mã) .. !! –

+0

Để cài đặt dateutil: 'pip install python-dateutil'. Nó giống như họ muốn bạn nghĩ rằng nó không phải là một gói legit khi họ không cung cấp làm thế nào để cài đặt nó thông qua 'pip'. – ArtOfWarfare

14

Bạn nên xem gói dateutil.

+6

đặc biệt là 'dateutil.parser.parse()' – Kimvais

+0

thanx cho câu trả lời .. !! .. nhưng một điều .. "dateutil.parser.parse" đang phân tích cú pháp 3 định dạng ngày đầu tiên .. nhưng không thể phân tích cú pháp định dạng ngày cuối cùng (đó là một giá trị dài) .. Nó được hiển thị một năm "ngoài phạm vi" Ngoại lệ ... Nhưng python inbuilt datetime module có thể phân tích giá trị dài này..why là nó như vậy .. ?? –

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