如何获取一天的第一个日期时间?
How to get the first datetime of a day?
使用 pytz 和 Python 3.4,如何在给定的时区(比如 'America/Sao_Paulo'
)?
使用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)
如果你运行代码;它生成 NonExistentTimeError
。如何处理此错误取决于应用程序,例如,在午夜附近获取一些有效的本地时间:
aware = tz.normalize(tz.localize(naive, is_dst=False))
或者您可以逐分钟增加时间,直到获得有效的本地(圣保罗)时间:
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
结果:
>>> 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'
注:第一个有效时间为当日01:00
。并且时区比 UTC 晚两个小时(local = utc - 2)。
使用 pytz 和 Python 3.4,如何在给定的时区(比如 'America/Sao_Paulo'
)?
使用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)
如果你运行代码;它生成 NonExistentTimeError
。如何处理此错误取决于应用程序,例如,在午夜附近获取一些有效的本地时间:
aware = tz.normalize(tz.localize(naive, is_dst=False))
或者您可以逐分钟增加时间,直到获得有效的本地(圣保罗)时间:
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
结果:
>>> 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'
注:第一个有效时间为当日01:00
。并且时区比 UTC 晚两个小时(local = utc - 2)。