如何获取一天中的第一个日期时间?

6
使用pytz和Python 3.4,如何在给定时区(例如'America/Sao_Paulo')中获取指定日期(例如2014-10-19)的第一个datetime?

1
你有一个 datetime 列表吗?你所说的“第一个”是什么意思? - Daniel
有很多种解释这个问题的方式,一些输入和期望的输出会让你尝试做什么更加明显。 - Padraic Cunningham
我所说的“第一”是指在当天和时区中,不大于该天和时区中任何其他日期时间的日期时间。 - lvella
1
如何获取给定时区的“午夜”UTC时间? - jfs
1个回答

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)

如果运行代码,会产生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 - 2)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接