如何获得一天的第一个约会时间?

lve*_*lla 5 python timezone datetime pytz python-3.x

使用pytz和Python 3.4,如何datetime在给定的时区(比如说'America/Sao_Paulo')中获得给定一天的第一天(比如说2014-10-19 )?

jfs*_*jfs 5

使用localize()方法附加时区:

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)
Run Code Online (Sandbox Code Playgroud)

如果你运行代码;它生成NonExistentTimeError. 如何处理此错误取决于应用程序,例如,要获取午夜附近的有效当地时间:

aware = tz.normalize(tz.localize(naive, is_dst=False))
Run Code Online (Sandbox Code Playgroud)

或者您可以逐分钟增加时间,直到获得有效的本地(圣保罗)时间:

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
Run Code Online (Sandbox Code Playgroud)

结果:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

注:首次有效时间为01:00当日。并且时区比 UTC 晚两个小时(本地 = utc - 2)。