2011-11-02 7 views
11

Şu anda, saf Python datetimes'lerini döndüren bir takvim sistemi için arka uçta çalışıyorum. Ön uçun çalışması, kullanıcının çeşitli takvim etkinlikleri oluşturmasıdır ve ön kısım, oluşturdukları olayın naif versiyonunu döndürür (örneğin, kullanıcı 5 Ekim 2020'yi 3: 00-16: 00 saatleri arasında seçerse, ön ödeme geri döner datetime.datetime (2020, 10, 5, 15, 0, 0) başlangıç ​​olarak ve datetime.datetime (2011, 10, 5, 16, 0, 0) olarak sonlandırılır.Bir naif datetime'yi Python'da DST'nin farkında olduğu datetime olarak nasıl dönüştürebilirim?

Yapmam gerekenler: naif datetime almak ve bir veritabanında depolamak için UTC'ye dönüştürmek için.Kullanıcı her zaman kendi saat dilimi tercihini belirtmiş, bu yüzden naif datetime zaman dilimi tercihi olarak aynı zaman dilimi olarak kabul edilir. UTC'ye göre saklanmalıdır, böylece kullanıcılar kendi saat dilimlerini değiştirirse, varolan olaylar hala zamanlamalarını yapmaları için doğru zamanda işlenecektir.

Ön taraf kontrolümün dışında, bu yüzden aldığım verileri değiştiremiyorum. Veri tabanı tasarımı da kontrolümün dışında, bu yüzden hangi verilerin saklandığını ve nasıl değiştirilemediğini değiştiremiyorum.

import pytz 
def convert_to_UTC(naive_datetime, user_tz_preference): 
    user_datetime = naive_datetime.replace(tzinfo=user_tz_preference) 
    utc_datetime = user_datetime.astimezone(pytz.utc) 

Ben Yaz Saati ile ilgilidir koştu sorun: Burada

şimdiye kadar almış yaklaşık yaklaşımdır 'yerine' kullanarak o

>>> from datetime import datetime 
>>> import pytz 
>>> user_tz_preference = pytz.timezone('US/Pacific') 
>>> naive_datetime = datetime(2011, 10, 26, 12, 0, 0) 
>>> user_datetime = naive_datetime.replace(tzinfo=user_tz_preference) 
>>> user_datetime 
datetime.datetime(2011, 10, 26, 12, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>) 
>>> received_utc = user_datetime.astimezone(pytz.utc) 
>>> received_utc 
datetime.datetime(2011, 10, 26, 20, 0, tzinfo=<UTC>) 
>>> expected_utc = datetime(2011, 10, 26, 19, 0, tzinfo=pytz.utc) 
>>> expected_utc == received_utc 
False 

Uyarı zaman dilimini ayarlar PDT yerine PST yerine, tarih beklenmedik şekilde 8 saatlik bir UTC ofsetini verir, bu da beklenen 7 saatlik DST sapması yerine, zamanın yanlış kaydedilmesini sağlar.

Naif datetime'yi doğru PDT'ye (veya başka bir zamana bağlı DST) tzinfo'ya dönüştürmek için hangi seçeneklerim var?

(Ayrıca, tüm kullanıcıların DST'yi gözlemleyen bir saat diliminde yaşamadıklarını veya farklı zamanlarda geçiş yapan bir saat diliminde yaşayabileceğini, böylece kaydetmeden önce zaman ayarlı düzeltme gibi bir çözüm yapabilmem için Saat diliminin DST'yi destekleyip desteklemediğini ve hangi tarihlerde değiştirileceğini bilmek gerekir.

+0

http://www.enricozini.org/2009/debian/using-python-datetime/ ait –

+0

olası yinelenen [bir habersiz datetime zaman dilimini nasıl yapılır python'da farkında olmak] (http://stackoverflow.com/questions/7065164/how-to-make-an-unaware-datetime-timezone-aware-in-python) – Pureferret

cevap

18

Pytz en localize işlevi yapabilirsiniz: http://pytz.sourceforge.net/#localized-times-and-date-arithmetic

from datetime import datetime 
import pytz  

tz = pytz.timezone('US/Pacific') 
naive_dt = datetime(2020, 10, 5, 15, 0, 0) 
utc_dt = tz.localize(naive_dt, is_dst=None).astimezone(pytz.utc) 
# -> 2020-10-05 22:00:00+00:00 
+0

Teşekkür ederiz. Bu aradığım şey gibi görünüyor. – Jay

İlgili konular