2013-08-30 42 views
20

Tôi đang cố gắng chuyển đổi múi giờ nhận biết datetime đối tượng thành UTC và sau đó quay lại múi giờ ban đầu của nó. Tôi có một đoạn sauchuyển đổi múi giờ và múi giờ với pytz - hành vi thổi tâm trí

t = datetime(
    2013, 11, 22, hour=11, minute=0, 
    tzinfo=pytz.timezone('Europe/Warsaw') 
) 

bây giờ trong ipython:

In [18]: t 
Out[18]: datetime.datetime(
    2013, 11, 22, 11, 0, tzinfo=<DstTzInfo 'Europe/Warsaw' WMT+1:24:00 STD> 
) 

và bây giờ chúng ta hãy cố gắng làm chuyển đổi sang UTC và ngược lại. Tôi mong muốn có cùng một đại diện như:

In [19]: t.astimezone(pytz.utc).astimezone(pytz.timezone('Europe/Warsaw')) 
Out[19]: datetime.datetime(
    2013, 11, 22, 10, 36, tzinfo=<DstTzInfo 'Europe/Warsaw' CET+1:00:00 STD> 
) 

Tuy nhiên, chúng tôi thấy rằng Out[18]Out[19] khác nhau. Chuyện gì vậy?

+1

cửa hàng Django datetimes cơ sở dữ liệu ngây thơ khôn ngoan. Nếu bạn xử lý trường hợp đó, hãy xem tại đây để chuyển đổi ngày thành múi giờ bạn cần: https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#usage – Jingo

+0

liệu Django có lưu trữ các thời gian ngây thơ không phải là được kiểm soát bởi cài đặt 'USE_TZ'. Nếu đó là 'True' thì Django xử lý datetimes dưới dạng các biểu mẫu vv như đang ở trong [múi giờ hiện tại] (https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#selecting-the-current-time -zone) và lưu trữ chúng trong db được chuyển thành UTC. – Anentropic

Trả lời

44

Tài liệu http://pytz.sourceforge.net/ khẳng định "Thật không may khi sử dụng đối số tzinfo của các nhà xây dựng datetime chuẩn" không hoạt động 'với pytz cho nhiều múi giờ. " Mã

t = datetime(
    2013, 5, 11, hour=11, minute=0, 
    tzinfo=pytz.timezone('Europe/Warsaw') 
) 

không hoạt động theo này, thay vào đó bạn nên sử dụng phương pháp địa hóa:

t = pytz.timezone('Europe/Warsaw').localize(
     datetime(2013, 5, 11, hour=11, minute=0)) 
+0

Rất tốt để biết. – dgel

+0

Bất kỳ ý tưởng nào là lý do cho nó? – yakxxx

+18

Mô-đun datetime Python giả định đối tượng múi giờ có chênh lệch UTC không đổi. Các đối tượng múi giờ Pytz có các chênh lệch UTC khác nhau (vì thời gian tiết kiệm ánh sáng ban ngày cũng như các thay đổi múi giờ lịch sử). Khi bạn sử dụng bản địa hóa của pytz(), nó có thể lấy giá trị chênh lệch đúng cho ngày cụ thể đó. Khi bạn sử dụng thay thế datetime (tzinfo ==), bạn kết thúc với bù đắp UTC cũ nhất cho múi giờ đó trong cơ sở dữ liệu. –

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