Use localize()
method to attach the timezone:
from datetime import datetime
import pytz # $ pip install pytz
tz = pytz.timezone('America/Sao_Paulo')
naive = datetime(2014, 10, 19)
aware = tz.localize(naive, is_dst=None)
If you run the code; it generates NonExistentTimeError
. How to deal with this error depends on the application e.g., to get some valid local time near the midnight:
aware = tz.normalize(tz.localize(naive, is_dst=False))
Or you could increment the time minute by minute until you'll get a valid local (Sao Paulo) time:
from datetime import datetime, timedelta
import pytz # $ pip install pytz
tz = pytz.timezone('America/Sao_Paulo')
d = naive = datetime(2014, 10, 19)
while True:
try:
aware = tz.localize(d, is_dst=None)
except pytz.AmbiguousTimeError:
aware = tz.localize(d, is_dst=False)
assert tz.localize(d, is_dst=False) > tz.localize(d, is_dst=True)
break
except pytz.NonExistentTimeError:
d += timedelta(minutes=1) # try future time
continue
else:
break
Result:
>>> aware
datetime.datetime(2014, 10, 19, 1, 0, tzinfo=<DstTzInfo 'America/Sao_Paulo' BRST-1 day, 22:00:00 DST>
>>> aware.strftime('%Y-%m-%d %H:%M:%S %Z%z')
'2014-10-19 01:00:00 BRST-0200'
Note: the first valid time is 01:00
on that day. And the timezone is two hours behind UTC (local = utc - 2).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…