2015-06-17 20 views
5

Tôi đang viết một kịch bản python, trong đó có hai dòng mã chuyển đổi ngày đó đã được truyền vào phương pháp để thời gian tính theo giờ UTC:bù đắp múi giờ Python sai?

print "Timezone: %s" % get_localzone() 
date = datetime.now(tz=get_localzone()) 
print "Local time: %s" % date 
utc = pytz.utc 
utc_date = date.astimezone(utc) 
print "UTC date: %s" % utc_date 

và kết quả là:

Timezone: America/Chicago 
Local time: 2015-06-17 14:58:45.224827-05:00 
UTC date: 2015-06-17 19:58:45.224827+00:00 

Như bạn có thể xem chênh lệch theo giờ địa phương là "-05: 00", không có gì sai với nó, nhưng khi tôi tạo một đối tượng datetime tùy chỉnh với cùng một múi giờ:

date = datetime(2015, 6, 17, 14, 58, 45, tzinfo=get_localzone()) 

Kết quả trở thành s:

Timezone: America/Chicago 
Local time: 2015-06-17 14:58:45-05:51 

Giá trị bù trừ thay đổi từ "-05: 00" thành "-05: 51". Tôi thậm chí còn sử dụng cùng một lúc mà "datetime.now()" đầu tiên được tạo ra, và múi giờ không thay đổi, ai đó có thể giải thích cho tôi tại sao điều này xảy ra? Cảm ơn!

Trả lời

8

Thay vì chỉ định tham số tzinfo, hãy sử dụng phương thức localize từ pytz.

tz = get_localzone() 
date = tz.localize(datetime(2015, 6, 17, 14, 58, 45)) 

này được thảo luận nổi bật trong the pytz documentation, bắt đầu với những người đầu tiên "Ghi chú" hộp, và trong mẫu mã đầu tiên.

Nó cũng được hiển thị trong the tzlocal documentation, là nơi (tôi giả định) phương pháp get_localzone() của bạn đến từ đó.

FYI, các -05:51 bù đắp xuất phát từ giá trị LMT ban đầu của vùng America/Chicago thời gian, đó là -05:50:36 và được giả định đã được sử dụng cách trở lại vào năm 1883 as shown here. Nó được làm tròn đến phút gần nhất, cung cấp giá trị LMT -05:51 trong Python. Bạn đang thấy rằng bù đắp bởi vì phương pháp địa phương hóa đã không được gọi, do đó, pytz chỉ là bằng cách sử dụng bù đắp đầu tiên được biết đến mục nhập của múi giờ đó.

+0

Cảm ơn câu trả lời chi tiết, nó đã giải quyết được vấn đề của tôi :) –

+1

@YueQiLi: lưu ý: bạn nên sử dụng 'datetime.now (tz)' thay vì 'tz.localize (datetime.now())'. Dữ liệu sau có thể thất bại nếu giờ địa phương không rõ ràng (ví dụ: trong quá trình chuyển đổi DST). Nếu thời gian đầu vào không phải là bây giờ thì bạn có thể chuyển tham số 'is_dst' vào' tz.localize() ', để phân biệt. – jfs

+0

@ J.F.Sebastian Cảm ơn, tôi vừa xem qua [tài liệu pytz] (http://pythonhosted.org/pytz/) và bạn nói đúng, tôi sẽ thêm mã này vào mã của tôi. Về câu hỏi tương tự khác, mặc dù thực tế là cả hai vấn đề của chúng tôi đều gây ra bởi việc lạm dụng nhà xây dựng datetime, vẫn rất khó cho những người mới bắt đầu như tôi phân loại chúng thành cùng một loại vấn đề. Việc giữ mỏ của tôi sẽ hữu ích cho những người khác để tránh loại sai lầm tân binh này :) –

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