2012-04-24 14 views
5

máy chủ đám mây của tôi ghi thời gian ở định dạng này:ngày Parsing và timestamps trong Python với định dạng time.strptime

[17/Dec/2011:09:48:49 -0600] 

Để đọc nó vào biến Python, tôi có thể nói:

>>>str = '17/Dec/2011:09:48:49 -0600' 
>>>import time 
>>>print time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600") 

Kết quả:

time.struct_time(tm_year=2011, tm-mon=12, tm=mday=17, tm_hour=9, tm_min=48, tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1) 

hoặc tôi có thể thử

>>>mytime = time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600") 
>>>print mytime.tm_hour 

Kết quả:

9 

nào -0600 làm gì? Tôi mong đợi nó để điều chỉnh giá trị giờ trong đối tượng thời gian ngày? Có ký tự đại diện để sử dụng thay vì mã hóa cứng -0600 không?

Trả lời

8

-0600 là giá trị chênh lệch từ Giờ chuẩn Greenwich (GMT). Như another SO question already says, time.strptime không thể đọc bù thời gian, mặc dù datetime.strftime có thể tạo chúng.

Như được giải thích ở đầu the datetime module's documentation, có hai cách tiếp cận "thời gian" trong python, ngây thơ hoặc nhận thức. Khi tất cả các bạn quan tâm là thời gian bên trong hệ thống của bạn, đối phó với thời gian ngây thơ/datetime đối tượng là tốt (trong trường hợp bạn có thể dải ra bù đắp như alan đề nghị). Khi bạn cần so sánh các giá trị bên trong hệ thống của bạn với khái niệm thời gian thực trên thế giới thực thời gian, bạn phải bắt đầu xử lý với bù đắp đó.

dễ dàng cách để giải quyết vấn đề này chỉ là use python-dateutil. Nó có một số parse function sẽ làm hết sức để phù hợp với chuỗi ngày bạn chuyển sang nhiều định dạng và trả về một phiên bản datetime khả thi thể hiện phỏng đoán tốt nhất của nó theo ý bạn.

>>> from dateutil.parser import parse 
>>> parse('17/Dec/2011:09:48:49 -0600', fuzzy=True) 
datetime.datetime(2011, 12, 17, 9, 48, 49, tzinfo=tzoffset(None, -21600)) 

Thông thường, việc phần mềm đưa ra "phỏng đoán tốt nhất" là một điều xấu. Trong trường hợp này, có vẻ như hợp lý nếu định dạng đầu vào của bạn ổn định. Đối phó với thời gian trong phát triển phần mềm là khó khăn, chỉ cần đi mua sắm.

+0

Im hãy xem python-dateutil. Đã không nhận thức được mục đích của nó. – TGanoe

2

Đó là khoản chênh lệch từ GMT. Nếu bạn không muốn nó, chỉ cần dải nó off:

>>> import time 
>>> line = '17/Dec/2011:09:48:49 -0600' 
>>> line = line.split(' ')[0] 
>>> print time.strptime(line,"%d/%b/%Y:%H:%M:%S") 
time.struct_time(tm_year=2011, tm_mon=12, tm_mday=17, tm_hour=9, tm_min=48, tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1) 
+0

Tôi thích cách bạn chia ngày và lấy chỉ mục đầu tiên trên cùng một dòng – TGanoe

+0

nó cũng hoạt động với các cụm từ thông dụng: newdate = re.split ("", myStr) [0] – TGanoe

1

strptime đơn giản phù hợp với từ bổ nghĩa (%d, %b, ...) với các phân đoạn tương ứng của chuỗi và sau đó chuyển đổi tương xứng với mảnh chuỗi một số nguyên. Vì vậy, trong trường hợp của bạn, các -0600 chỉ làm cho nó để chuỗi định dạng của bạn phù hợp với chuỗi đầu vào.

Nếu bạn muốn điều chỉnh thời gian theo một khoảng trống được chỉ định, tôi khuyên bạn nên sử dụng đối tượng datetime.

>>>s = '17/Dec/2011:09:48:49 -0600' 
>>>from datetime import datetime,timedelta 
>>>mytime = datetime.strptime(s,"%d/%b/%Y:%H:%M:%S -0600") 
>>>dt = timedelta(minutes=6*60) #6 hours 
>>>mytime-=dt 
>>>print mytime 
2011-12-17 03:48:49 
>>>print mytime.hour 
3 

Cũng lưu ý rằng vì str được xây dựng nên thường không nên gán lại.

+0

Ồ, cảm ơn vì đã chỉ ra rằng sử dụng str như một tên biến. Thói quen xấu! – TGanoe