<p>如果使用不知道时区(尤其是DST)的naive <code>datetime</code>对象,您将获得<code>2013-03-10</code>:</p>
<pre><code>from datetime import datetime, timedelta
dt_naive = datetime(2013, 3, 11, 0, 35)
print((dt_naive - timedelta(days=1)).date()) # ignores DST
# -> 2013-03-10
</code></pre>
<p><code>2013-03-09</code>如果您对24小时前的日期感兴趣,那么它是正确的。</p>
<pre><code>import pytz # $ pip install pytz
local_tz = pytz.timezone("America/Chicago") # specify your local timezone
dt = local_tz.localize(dt_naive, is_dst=None) # raise if dt_naive is ambiguous
yesterday = local_tz.normalize(dt - timedelta(days=1)).date()
print(yesterday)
# -> 2013-03-09
</code></pre>
<p>注意:<code>.date()</code>删除时区信息,这样您将再次获得<code>2013-03-10</code>:</p>
<pre><code>print(dt.date() - timedelta(days=1))
# -> 2013-03-10
</code></pre>
<p>要获得昨天的特定时区:</p>
<pre><code>from datetime import datetime, time, timedelta
import pytz # $ pip install pytz
tz = pytz.timezone("America/Chicago")
yesterday = datetime.now(tz).date() - timedelta(days=1)
# to add timezone info back (to get yesterday's midnight)
midnight = tz.localize(datetime.combine(yesterday, time(0, 0)), is_dst=None)
</code></pre>
<p>如果时区在该时间前后丢失了天,则通过删除时区信息获取昨天可能会失败。然后,此方法将生成给定时区中不存在的日期(<code>tz.localize()</code>引发错误)。</p>