2009-08-19 32 views
6

Giả sử tôi có múi giờ như "2009-08-18 13: 52: 54-04". Tôi có thể phân tích hầu hết bằng cách sử dụng một dòng như sau:Làm cách nào để phân tích cú pháp múi giờ với bù trừ UTC bằng Python?

datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S") 

Tuy nhiên, tôi không thể có múi giờ hoạt động. Có một% Z xử lý các múi giờ văn bản ("EST", "UTC", v.v.) nhưng tôi không thấy bất kỳ thứ gì có thể phân tích cú pháp "-04".

+0

Dupe- [Làm thế nào để dịch một tiêu chuẩn ISO 8601 chuỗi datetime vào một đối tượng Python datetime?] (Http://stackoverflow.com/câu hỏi/969285/how-do-i-dịch-a-iso-8601-datetime-chuỗi-thành-một-python-datetime-đối tượng/3908349 # 3908349) (và câu trả lời là 'dateutil.parser.phân tích cú pháp (datestring) 'trong cả hai) – Yarin

+0

liên quan: [Làm thế nào để phân tích ngày với -0400 chuỗi múi giờ trong python?] (http://stackoverflow.com/q/1101508/4279) – jfs

Trả lời

0

tôi chạy qua cùng một vấn đề thời gian gần đây và làm việc xung quanh nó sử dụng mã này:

gmt_offset_str = time_string[-3:] 
gmt_offset_seconds = int(gmt_offset_str)*60*60 
timestamp = time.strptime(time_string[:-4], '%Y-%m-%d %H:%M:%S') 
return time.localtime(time.mktime(timestamp)-gmt_offset_seconds) 

Tôi cũng sẽ quan tâm đến một giải pháp thanh lịch hơn.

+3

thay vì giải pháp ngây thơ. Nó hoạt động, nhưng bạn sẽ nhận được các vấn đề xấu xí khi làm việc qua thời gian tiết kiệm ban ngày và những người không sử dụng nó. Tốt hơn là sử dụng các đối tượng tích hợp sẵn. – voyager

+0

'mktime()' không chính xác ở đây. Sử dụng 'calendar.timegm()' để thay thế. 'email.utils.mktime_tz' từ stdlib có lỗi tương tự trước Python 2.7.4 – jfs

0

Bạn có thể làm điều đó directrly trên constructor: class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]), tzinfo trở thành một đối tượng dervided datetime.tzinfo.

tzinfo là một lớp cơ sở trừu tượng, có nghĩa là lớp này sẽ không được khởi tạo trực tiếp. Bạn cần lấy ra một lớp con cụ thể, và (ít nhất) cung cấp việc triển khai các phương thức tzinfo tiêu chuẩn cần thiết bởi các phương thức datetime mà bạn sử dụng. Mô-đun datetime không cung cấp bất kỳ lớp con cụ thể nào của tzinfo.

Điều bạn cần ghi đè là phương pháp utcoffset(self, dt).

Trả lại chênh lệch giờ địa phương từ UTC, sau vài phút về phía đông của UTC. Nếu giờ địa phương ở phía tây UTC, điều này sẽ là số âm. Lưu ý rằng điều này được dự định là tổng số bù trừ từ UTC; ví dụ, nếu một đối tượng tzinfo đại diện cho cả điều chỉnh múi giờ và DST, thì utcoffset() sẽ trả về tổng của chúng. Nếu không biết UTC offset, trả về None. Khác giá trị trả lại phải là đối tượng timedelta chỉ định toàn bộ số phút trong phạm vi từ -1439 đến 1439 bao gồm (1440 = 24 * 60; độ lớn của bù trừ phải nhỏ hơn một ngày). Hầu hết các triển khai của UTCOFFSET() có thể sẽ trông giống như một trong hai:

return CONSTANT # fixed-offset class

return CONSTANT + self.dst(dt) # daylight-aware class

Nếu UTCOFFSET() không trả lại Không, dst() không nên trở về None một trong hai.

Việc thực hiện mặc định utcoffset() tăng NotImplementedError.

22

Có thể bạn có thể sử dụng dateutil.parser.parse? Phương pháp đó cũng được đề cập trên wiki.python.org/WorkingWithTime.

>>> from dateutil.parser import parse 
>>> parse("2009-08-18 13:52:54-04") 
datetime.datetime(2009, 8, 18, 13, 52, 54, tzinfo=tzoffset(None, -14400)) 

(là câu hỏi này là một bản sao?)

+3

+1 cho dateutil. Đây là câu trả lời của bạn – Yarin

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