¿Cómo obtener la primera fecha / hora de un día?

Usando pytz y Python 3.4, ¿cómo obtener la primera datetime de un día determinado (digamos, 2014-10-19), en una zona horaria determinada (digamos 'America/Sao_Paulo' )?

Use el método localize() para adjuntar la zona horaria:

 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) 

Si ejecuta el código; genera NonExistentTimeError . Cómo manejar este error depende de la aplicación, por ejemplo, para obtener una hora local válida cerca de la medianoche:

 aware = tz.normalize(tz.localize(naive, is_dst=False)) 

O puede boost la hora minuto a minuto hasta que obtenga una hora local válida (Sao Paulo):

 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 

Resultado:

 >>> aware datetime.datetime(2014, 10, 19, 1, 0, tzinfo= >>> aware.strftime('%Y-%m-%d %H:%M:%S %Z%z') '2014-10-19 01:00:00 BRST-0200' 

Nota: la primera hora válida es 01:00 en ese día. Y la zona horaria está dos horas por detrás de UTC (local = utc – 2).