2012-10-09 35 views
5

thể trùng lặp:
Weird timezone issue with pytzPYTZ 'Mỹ/Edmonton' bù đắp sai

Điều này có vẻ sai:

>>> import pytz 
>>> z1 = timezone('America/Edmonton') 
>>> z2 = timezone('US/Mountain') 
>>> z1 
<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD> 
>>> z2 
<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD> 
>>> pytz.VERSION 
'2012f' 
>>> 

'Mỹ/Edmonton' và 'Mỹ/Đông 'phải là cùng múi giờ (17:00:00 STD). Chưa kể đến 16:26:00 không có ý nghĩa gì cả.

- Cập nhật -

Trên đây có ý nghĩa trong bối cảnh của câu trả lời của Jon Skeet. Tuy nhiên, mọi thứ trở nên lạ khi tôi làm điều này:

>>> d = datetime.now() 
>>> d 
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706) 

Tôi đã tạo một ngày ngây thơ. Kể từ khi 'Mỹ/Edmonton' múi giờ của tôi, tôi cố gắng thiết lập đó bằng tay:

>>> d2 = d.replace(tzinfo=timezone('America/Edmonton')) 
>>> d2 
datetime.datetime(2012, 10, 9, 15, 21, 41, 644706, tzinfo=<DstTzInfo 'America/Edmonton' LMT-1 day, 16:26:00 STD>) 

này không nên thay đổi bất cứ điều gì vì đó là TZ đúng. Tuy nhiên:

>>> d2.astimezone(timezone('US/Eastern')) 
datetime.datetime(2012, 10, 9, 18, 55, 41, 644706, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>) 

này nên cung cấp cho tôi một bù đắp là 2 giờ (chênh lệch giữa 'Mỹ/Đông' và 'Mỹ/Edmonton') nhưng nó mang lại cho tôi 3 giờ 26 phút (đó là 2 giờ cộng một giờ 26 phút: D) ​​

chèn timezone('US/Mountain') tạo kết quả chính xác trong astimezone(). Tạo một ngày giờ nhận thức với 'America/Edmonton' cũng sẽ hoạt động chính xác.

+0

Điều gì xảy ra khi bạn tạo 'datetime' với múi giờ hiện tại để bắt đầu, thay vì sử dụng' thay thế'? (Nó trông như thế này về cơ bản bị hỏng ...) –

+0

Sau đó, nó hoạt động tốt. Đáng buồn thay đó không phải là một lựa chọn trong trường hợp của tôi kể từ khi datetime ngây thơ được trả về bởi một hàm khác mà tôi không có quyền kiểm soát: ( – Goro

Trả lời

9

documentation for pytz một cách rõ ràng nói rằng việc tạo một datetime trực tiếp từ một múi giờ sẽ không hoạt động tất cả các trường hợp và chỉ đạo bạn thực hiện những việc sau thay vào đó:

d2 = timezone('America/Edmonton').localize(d) 
+1

ah, tất nhiên. RTFM :) – Goro

3

Nhìn vào dữ liệu 2012c TZDB, đây là quy tắc đặt ra cho Mỹ/Edmonton:

Zone America/Edmonton -7:33:52 -  LMT 1906 Sep 
         -7:00 Edm  M%sT 1987 
         -7:00 Canada M%sT 

Nó không rõ ràng với tôi những gì ngày/giờ đầu ra Python đang cố gắng để cho bạn thấy những bù đắp/tên cho, nhưng tôi nghi ngờ nó là một cái gì đó giống như 1900 - trong trường hợp 16:26:00 làm cho một số ý nghĩa với sự bù đắp của -7: 33: 52, và nó sẽ phù hợp với chữ viết tắt, quá.

Vì vậy, hoàn toàn khả thi là dữ liệu múi giờ là tốt và chỉ chọn hiển thị cho bạn một ngày/giờ lẻ làm ví dụ. (Nó không có ý nghĩa với tôi rằng đầu ra chuỗi của một múi giờ sẽ hiển thị một thời gian ở tất cả, phải trung thực ...)

+2

Cho đến khi bạn cố đính kèm múi giờ vào ngày/giờ, nó hiển thị định nghĩa sớm nhất mà nó chứa –

+0

@MarkRansom: Điều đó chắc chắn sẽ giải thích nó, có ... –

+0

ah, điều đó có ý nghĩa sau đó.Tuy nhiên tôi vẫn thấy những điều kỳ lạ khi cố gắng sử dụng astimezone() - được xây dựng ở trên – Goro

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