<h2>日期/时间比你想象的要复杂</h2>
<p>涉及日期/时间的计算可能非常棘手,因为您必须考虑时区、闰年、日光节约和许多角落情况。有一个<a href="http://pyvideo.org/video/946/what-you-need-to-know-about-datetimes" rel="nofollow noreferrer">enlightening video from the talk by Taavi Burns at PyCon2012</a>题为“您需要了解的日期时间”:</p>
<blockquote>
<p><a href="http://pyvideo.org/video/946/what-you-need-to-know-about-datetimes" rel="nofollow noreferrer"><strong>What you need to know about datetimes</strong></a>:<br/>
<code>time</code>, <code>datetime</code>, and <code>calendar</code> from the standard library are a bit messy. Find out: what to use where and how (particularly when you have users in many timezones), and what extra modules you might want to look into.</p>
<p><strong>Event</strong>: PyCon US 2012 / <strong>Speakers</strong>: Taavi Burns / <strong>Recorded</strong>: March 10, 2012</p>
</blockquote>
<h2>使用时区感知日期时间进行计算</h2>
<p>明天的<code>datetime.time</code>概念是无效的,因为<code>datetime.time</code>缺少任何日期信息。在比较之前,您可能希望将所有内容转换为时区感知<code>datetime.datetime</code>:</p>
<pre><code>def time_in_range(start, end, x):
today = timezone.localtime().date()
start = timezone.make_aware(datetime.datetime.combine(today, start))
end = timezone.make_aware(datetime.datetime.combine(today, end))
x = timezone.make_aware(datetime.datetime.combine(today, x))
if end <= start:
end += datetime.timedelta(days=1) # tomorrow!
if x <= start
x += datetime.timedelta(days=1) # tomorrow!
return start <= x <= end
</code></pre>