Python 时间处理标准库:time 与 datetime 模块
<p>Python 中内置了许多和操作时间有关的 API,它们分布在 <code>time</code> , <code>datetime</code> 等标准库中,用法繁多且容易混淆,本文将力求清晰地阐述这些 API 的关键部分和区别,帮助你了解并掌握其用法。</p>
<p>下文将分别介绍每个模块的主要目的、核心对象、常用方法以及用途,并在最后做分析对比,如果已经了解这些细节可以直接跳转到结尾的总结对比部分。</p>
<p>另外本文将避免涉及字符串格式化、时区、冬夏令时等更复杂深入的话题。</p>
<h2 id="time-模块">time 模块</h2>
<p>概括来说,<code>time</code> 模块通过系统底层的计时器获取自 <code>epoch</code> 以来经过的总秒数(可能为浮点数),即我们常说的 POSIX 时间戳(timestamp)。它的用法较为低阶,适合用做精确计时。对 Unix 系统来说, <code>epoch</code> 为 <code>1970年1月1日 00:00:00(UTC)</code>,因此该模块也可以将时间戳转换为具体的日期时间,但表示日期时间的对象结构非常简单,不适合进行复杂的操作和表示。</p>
<h3 id="核心对象">核心对象</h3>
<p><code>time</code> 模块的 API 中只有一个类: <code>time.struct_time</code>。</p>
<p><code>struct_time</code> 是一个转换 <code>epoch</code> 以来经过秒数得到的结构化的时间对象,它提供了类似 <code>namedtuple</code> 的 API,可以通过下标或属性名称获取对象的年月日时分秒等属性。调用 <code>gmtime()</code> ,<code>localtime()</code>,<code>strptime()</code> 等方法可得到 <code>struct_time</code> 实例。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">st</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">st</span>
</span></span><span class="line"><span class="cl"><span class="n">time</span><span class="o">.</span><span class="n">struct_time</span><span class="p">(</span><span class="n">tm_year</span><span class="o">=</span><span class="mi">2021</span><span class="p">,</span> <span class="n">tm_mon</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">tm_mday</span><span class="o">=</span><span class="mi">29</span><span class="p">,</span> <span class="n">tm_hour</span><span class="o">=</span><span class="mi">12</span><span class="p">,</span> <span class="n">tm_min</span><span class="o">=</span><span class="mi">39</span><span class="p">,</span> <span class="n">tm_sec</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">tm_wday</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">tm_yday</span><span class="o">=</span><span class="mi">119</span><span class="p">,</span> <span class="n">tm_isdst</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">st</span><span class="o">.</span><span class="n">tm_mon</span>
</span></span><span class="line"><span class="cl"><span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">st</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="mi">4</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>从示例中可以看到,<code>struct_time</code> 实例实质是一个数字组成的类元祖序列,该模块中接收 <code>struct_time</code> 实例作为参数的函数都可以直接接收一个同样长度的元祖。它只能简单的记录通过换算时间戳得到的年月日时分等属性,没有提供支持额外操作的其他方法,因此实践中的用途非常有限。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">st1</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">st2</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">st2</span> <span class="o">-</span> <span class="n">st1</span>
</span></span><span class="line"><span class="cl"><span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">File</span> <span class="s2">"<input>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o"><</span><span class="n">module</span><span class="o">></span>
</span></span><span class="line"><span class="cl"> <span class="n">st2</span> <span class="o">-</span> <span class="n">st1</span>
</span></span><span class="line"><span class="cl"><span class="ne">TypeError</span><span class="p">:</span> <span class="n">unsupported</span> <span class="n">operand</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="o">-</span><span class="p">:</span> <span class="s1">'time.struct_time'</span> <span class="ow">and</span> <span class="s1">'time.struct_time'</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="常见用途与函数">常见用途与函数</h3>
<ol>
<li>
<p>计时</p>
<ul>
<li>
<p><code>time.time()</code> 以浮点数的形式返回自 <code>epoch</code> 以来经过的时间秒数。常见用法是通过计算两次调用之间的间隔来得出程序执行时间。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="mf">1619665423.683973</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>time.sleep(seconds)</code> 暂停调用线程的执行,暂停时间为给定的秒数。经常用于测试模拟,实际的暂停时间可能超出给定秒数。</p>
</li>
<li>
<p><code>time.perf_counter()</code> 是计算较短时间间隔的更好方法,结果更为精确,在计算执行时间时可替代上述的 <code>time.time()</code>。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">end</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">end</span> <span class="o">-</span> <span class="n">start</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.731515233999744</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
</li>
<li>
<p>在 <code>struct_time</code> 和时间戳之间进行转换</p>
<ul>
<li>
<p><code>time.gmtime([secs])</code> 将给定秒数转换为一个 UTC 时区 <code>struct_time</code> 对象,若未提供秒数将使用 <code>time.time()</code> 得到的返回值。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">now</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">time</span><span class="o">.</span><span class="n">gmtime</span><span class="p">(</span><span class="n">now</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">time</span><span class="o">.</span><span class="n">struct_time</span><span class="p">(</span><span class="n">tm_year</span><span class="o">=</span><span class="mi">2021</span><span class="p">,</span> <span class="n">tm_mon</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">tm_mday</span><span class="o">=</span><span class="mi">29</span><span class="p">,</span> <span class="n">tm_hour</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">tm_min</span><span class="o">=</span><span class="mi">51</span><span class="p">,</span> <span class="n">tm_sec</span><span class="o">=</span><span class="mi">54</span><span class="p">,</span> <span class="n">tm_wday</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">tm_yday</span><span class="o">=</span><span class="mi">119</span><span class="p">,</span> <span class="n">tm_isdst</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">time</span><span class="o">.</span><span class="n">gmtime</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">time</span><span class="o">.</span><span class="n">struct_time</span><span class="p">(</span><span class="n">tm_year</span><span class="o">=</span><span class="mi">2021</span><span class="p">,</span> <span class="n">tm_mon</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">tm_mday</span><span class="o">=</span><span class="mi">29</span><span class="p">,</span> <span class="n">tm_hour</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">tm_min</span><span class="o">=</span><span class="mi">51</span><span class="p">,</span> <span class="n">tm_sec</span><span class="o">=</span><span class="mi">56</span><span class="p">,</span> <span class="n">tm_wday</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">tm_yday</span><span class="o">=</span><span class="mi">119</span><span class="p">,</span> <span class="n">tm_isdst</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>time.localtime([secs])</code> 将给定秒数转换为一个本地时区的 <code>struct_time</code> 对象,若未提供秒数将使用 <code>time.time()</code> 得到的返回值。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">time</span><span class="o">.</span><span class="n">struct_time</span><span class="p">(</span><span class="n">tm_year</span><span class="o">=</span><span class="mi">2021</span><span class="p">,</span> <span class="n">tm_mon</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">tm_mday</span><span class="o">=</span><span class="mi">29</span><span class="p">,</span> <span class="n">tm_hour</span><span class="o">=</span><span class="mi">12</span><span class="p">,</span> <span class="n">tm_min</span><span class="o">=</span><span class="mi">53</span><span class="p">,</span> <span class="n">tm_sec</span><span class="o">=</span><span class="mi">38</span><span class="p">,</span> <span class="n">tm_wday</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">tm_yday</span><span class="o">=</span><span class="mi">119</span><span class="p">,</span> <span class="n">tm_isdst</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>time.mktime(t)</code> 将一个 <code>struct_time</code> 对象转换为秒数,该对象将被当做本地时区处理,效果刚好与 <code>time.localtime([secs])</code> 相反。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">time</span><span class="o">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="mf">1619672313.0</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
</li>
<li>
<p>在 <code>struct_time</code> 和字符串之间进行转换</p>
<ul>
<li>
<p><code>time.strftime(format[, t])</code> 将一个 <code>struct_time</code> 对象按指定的 <code>format</code> 编码格式化为字符串,<code>t</code> 的默认值是 <code>time.localtime()</code> 的返回值。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%H:%M:%S'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="s1">'13:10:37'</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>time.strptime(string[, format])</code> 将一个字符串按指定的 <code>format</code> 编码解析为 <code>struct_time</code> 对象,<code>format</code> 的默认值为 <code>"%a %b %d %H:%M:%S %Y"</code>。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">time</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="s2">"30 Nov 00"</span><span class="p">,</span> <span class="s2">"</span><span class="si">%d</span><span class="s2"> %b %y"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">time</span><span class="o">.</span><span class="n">struct_time</span><span class="p">(</span><span class="n">tm_year</span><span class="o">=</span><span class="mi">2000</span><span class="p">,</span> <span class="n">tm_mon</span><span class="o">=</span><span class="mi">11</span><span class="p">,</span> <span class="n">tm_mday</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">tm_hour</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">tm_min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">tm_sec</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">tm_wday</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">tm_yday</span><span class="o">=</span><span class="mi">335</span><span class="p">,</span> <span class="n">tm_isdst</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如上示例,解析时未提供的时间单位将使用默认值填充。</p>
</li>
</ul>
</li>
</ol>
<h2 id="datetime-模块">datetime 模块</h2>
<p><code>datetime</code> 模块支持日期和时间的运算,但实现的重点是为输出格式化和操作提供高效的属性提取。</p>
<p><code>datetime</code> 模块提供了一些用于操作日期和时间的类。该模块的绝大部分功能都围绕着以下 4 个类(以及另外两个关于时区的类)的方法和属性来实现。一个容易让人混淆的点是,虽然它们全都是 Python 类,但在命名中并未遵循首字母大写的惯例,在导入时看上去就像是 <code>datetime</code> 下的子包或者子模块。</p>
<p>我们将简要介绍每一个类<strong>常用的</strong>实例构造方式、支持的操作符、实例方法以及实例属性。</p>
<h3 id="date"><code>date</code></h3>
<p>表示日期类型。</p>
<h4 id="实例构造方式">实例构造方式</h4>
<ul>
<li>
<p>实例化 <code>date</code> 类,需要传入日期对应的年月日参数。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">date</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>调用 <code>date.fromtimestamp(timestamp)</code> 类方法,需要传入的参数为通过 <code>time</code> 模块获取的 <code>epoch</code> 以来秒数(即时间戳)。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">date</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>调用 <code>date.today()</code> 类方法,实质是以当前时间戳作为参数调用 <code>date.fromtimestamp()</code> 类方法。</p>
</li>
<li>
<p>调用 <code>date.fromisoformat(date_string)</code> 类方法,这是一种较为直观的创建方法:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">date</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="s1">'2021-04-29'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h4 id="支持的操作符">支持的操作符</h4>
<ul>
<li>支持与另一 <code>date</code> 对象进行 <code>==</code>,<code>≤</code>,<code><</code>,<code>≥</code>,<code>></code> 等比较操作。</li>
<li>支持与 <code>timedelta</code> 对象进行加减操作,结果依然为 <code>date</code> 对象。</li>
<li>支持与另一 <code>date</code> 对象进行相减操作,得到 <code>timedelta</code> 对象。</li>
<li>支持哈希。</li>
</ul>
<h4 id="实例方法">实例方法</h4>
<ul>
<li>
<p><code>strftime(self, fmt)</code> 按指定的 <code>fmt</code> 格式化编码返回当前 <code>date</code> 对象的字符串表示。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d1</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d1</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="s1">'2021-04-29'</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>isoformat(self)</code> 返回当前 <code>date</code> 对象的 <code>iso</code> 字符串表示。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d1</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="s1">'2021-04-29'</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>timetuple(self)</code> 将当前 <code>date</code> 对象转换成 <code>time</code> 模块的 <code>struct_time</code> 对象并返回,时分秒等属性使用默认值填充。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d1</span><span class="o">.</span><span class="n">timetuple</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">time</span><span class="o">.</span><span class="n">struct_time</span><span class="p">(</span><span class="n">tm_year</span><span class="o">=</span><span class="mi">2021</span><span class="p">,</span> <span class="n">tm_mon</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">tm_mday</span><span class="o">=</span><span class="mi">29</span><span class="p">,</span> <span class="n">tm_hour</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">tm_min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">tm_sec</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">tm_wday</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">tm_yday</span><span class="o">=</span><span class="mi">119</span><span class="p">,</span> <span class="n">tm_isdst</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>replace(self, year=None, month=None, day=None)</code> 返回替换当前 <code>date</code> 对象的某一属性后的副本。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d1</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">day</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">30</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>weekday(self)</code> 返回当前 <code>date</code> 对象所属的星期,从 0 开始。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d1</span><span class="o">.</span><span class="n">weekday</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="mi">3</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h4 id="实例属性">实例属性</h4>
<ul>
<li><code>year</code></li>
<li><code>month</code></li>
<li><code>day</code></li>
</ul>
<h3 id="time"><code>time</code></h3>
<p>表示时间(时分秒)类型。</p>
<h4 id="实例构造方式-1">实例构造方式</h4>
<p><code>time</code> 不支持通过时间戳构造实例。</p>
<ul>
<li>
<p>实例化 <code>time</code> 类并传入对应参数。需要传入时间对应的时分秒微秒等参数,参数均有取值范围且默认值为 0。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">date</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>通过调用<code>fromisoformat(cls, time_string)</code> 类方法,从 <code>iso</code> 字符串中创建一个实例:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">time</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="s1">'17:32:10'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">time</span><span class="p">(</span><span class="mi">17</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h4 id="支持的操作符-1">支持的操作符</h4>
<ul>
<li>支持与另一 <code>time</code> 对象进行 <code>==</code>,<code>≤</code>,<code><</code>,<code>≥</code>,<code>></code> 等比较操作。</li>
<li>支持哈希。</li>
</ul>
<p><code>time</code> 对象不支持与 <code>time</code> 或 <code>timedelta</code> 进行加减操作,如果我们想计算两个 <code>time</code> 对象之间的时间间隔,可以使用 <code>datetime.combine()</code> 将它们处理为日期相同的 <code>datetime</code> 对象再进行计算:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">combine</span><span class="p">(</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">(),</span> <span class="n">t2</span><span class="p">)</span> <span class="o">-</span> <span class="n">datetime</span><span class="o">.</span><span class="n">combine</span><span class="p">(</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">(),</span> <span class="n">t1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mi">4440</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="实例方法-1">实例方法</h4>
<ul>
<li>
<p><code>strftime(self, fmt)</code> 按指定的 <code>fmt</code> 格式化编码返回当前 <code>time</code> 对象的字符串表示。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="s1">'17:32:10'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">t</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Hh %Mm %Ss'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="s1">'17h 32m 10s'</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>isoformat(self)</code> 返回当前 <code>time</code> 对象的 <code>iso</code> 字符串表示。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="p">(</span><span class="n">hour</span><span class="o">=</span><span class="mi">17</span><span class="p">,</span> <span class="n">minute</span><span class="o">=</span><span class="mi">27</span><span class="p">,</span> <span class="n">second</span><span class="o">=</span><span class="mi">55</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">t</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="s1">'17:27:55'</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>replace(self,hour=None,minute=None,second=None,microsecond=None, tzinfo=True, *,fold=None)</code> 返回替换当前 <code>time</code> 对象的某一属性后的副本。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">t</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">hour</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">time</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">55</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h4 id="实例属性-1">实例属性</h4>
<ul>
<li><code>hour</code></li>
<li><code>minute</code></li>
<li><code>second</code></li>
<li>以及 <code>micorsecond</code> ,<code>tzinfo</code>,<code>fold</code> 等属性</li>
</ul>
<h3 id="datetime"><code>datetime</code></h3>
<p>表示包含日期时分的时间类型,是 <code>date</code> 的子类,因此也继承了 <code>date</code> 的所有属性和方法。它的实例还可以视作 <code>date</code> 和 <code>time</code> 实例的组合体,因此同时具备了两种对象的大部分方法和属性。</p>
<p>下文的介绍中不包含从 <code>date</code> 继承的方法和属性。</p>
<h4 id="实例构造方式-2">实例构造方式</h4>
<ul>
<li>
<p>实例化 <code>datetime</code> 类并传入对应参数,接收参数为 <code>date</code> 和 <code>time</code> 实例化参数的组合,其中日期参数为必填参数,其他参数有默认值。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="o">=</span><span class="mi">2021</span><span class="p">,</span> <span class="n">month</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">day</span><span class="o">=</span><span class="mi">29</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>调用 <code>datetime.now()</code> 或 <code>datetime.utcnow()</code> 类方法,区别为实例的对应时区不同。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">53</span><span class="p">,</span> <span class="mi">648203</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">671572</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>调用 <code>datetime.fromtimestamp(timestamp)</code> 或 <code>datetime.utcfromtimestamp(timestamp)</code> 类方法并传入时间戳,区别为实例的对应时区不同。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcfromtimestamp</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">798136</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">251251</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>通过调用 <code>datetime.fromisoformat(time_string)</code> 类方法,从 <code>iso</code> 字符串中创建一个实例:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="s1">'2021-04-29 16:09:32'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>通过调用 <code>datetime.combine(date, time)</code> 类方法,从 <code>date</code> 实例和 <code>time</code> 实例中创建一个新的 <code>datetime</code> 实例。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">combine</span><span class="p">(</span><span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">(),</span> <span class="n">time</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">12</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">12</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>通过调用 <code>datetime.strptime(date_string, format)</code> 类方法,解析格式化字符串并创建一个新的实例。</p>
</li>
</ul>
<h4 id="支持的操作符-2">支持的操作符</h4>
<ul>
<li><code>datetime</code> 支持与 <code>date</code> 进行相等比较,但结果一定为 <code>False</code> ,除此之外只支持与另一 <code>datetime</code> 对象执行 <code>==</code>,<code>≤</code>,<code><</code>,<code>≥</code>,<code>></code> 等比较操作。</li>
<li>支持与 <code>timedelta</code> 相加,结果为 <code>datetime</code>;支持与 <code>timedelta</code> 对象进行加减,结果依然为 <code>datetime</code> 对象,与另一 <code>datetime</code> 对象进行相减,得到 <code>timedelta</code> 对象。</li>
<li>同样支持哈希。</li>
</ul>
<h4 id="实例方法-2">实例方法</h4>
<p>除了从 <code>date</code> 继承的 <code>strftime()</code>、<code>timetuple()</code>、<code>isoformat()</code> 和 <code>replace()</code>等方法外,还拥有以下方法:</p>
<ul>
<li>
<p><code>timestamp(self)</code> 返回一个浮点数格式的 POSIX 时间戳。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt</span><span class="o">.</span><span class="n">timestamp</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="mf">1619685580.762657</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>date(self)</code> 返回一个代表日期部分的 <code>date</code> 对象。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt</span><span class="o">.</span><span class="n">date</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">29</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><code>time(self)</code> 返回一个代表时分部分的 <code>time</code> 对象。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">time</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span> <span class="mi">39</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">762657</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h4 id="实例属性-2">实例属性</h4>
<p>同时具有<code>date</code> 和 <code>time</code> 实例的所有属性。</p>
<h3 id="timedelta"><code>timedelta</code></h3>
<p>表示两个 <code>datetime</code> 对象之间的差异。</p>
<h4 id="实例构造方式-3">实例构造方式</h4>
<ul>
<li>
<p>实例化 <code>timedelta</code> 类并传入对应参数,接收参数与 <code>datetime</code> 类基本相同但不包括年,默认值均为 0。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>对两个 <code>datetime</code> 执行相减:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt1</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt2</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt2</span> <span class="o">-</span><span class="n">dt1</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">microseconds</span><span class="o">=</span><span class="mi">476390</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h4 id="支持的操作符-3">支持的操作符</h4>
<ul>
<li>
<p>只支持与另一 <code>timedelta</code> 进行比较,进行 <code>==</code>,<code>≤</code>,<code><</code>,<code>≥</code>,<code>></code> 等比较操作。</p>
</li>
<li>
<p><code>timedelta</code> 对象支持支持加减操作,<code>datetime</code> 与 <code>timedelta</code> 相加或相减仍然返回 <code>datetime</code>。</p>
</li>
<li>
<p><code>timedelta</code> 还支持乘除模除等操作符。</p>
</li>
<li>
<p>支持哈希。</p>
</li>
<li>
<p><code>timedelta</code> 是有符号的,支持 <code>abs()</code> 函数,可返回两个 <code>datetime</code> 之间的绝对间隔。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt1</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">dt2</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">td</span> <span class="o">=</span> <span class="n">dt1</span> <span class="o">-</span> <span class="n">dt2</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">td</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">seconds</span><span class="o">=</span><span class="mi">86395</span><span class="p">,</span> <span class="n">microseconds</span><span class="o">=</span><span class="mi">573188</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">td</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="o">-</span><span class="mf">4.426812</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="nb">abs</span><span class="p">(</span><span class="n">td</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">microseconds</span><span class="o">=</span><span class="mi">426812</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h4 id="实例方法-3">实例方法</h4>
<ul>
<li><code>total_seconds(self)</code> 返回该时间间隔的所有秒数。</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">minutes</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">seconds</span><span class="o">=</span><span class="mi">35</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d</span><span class="o">.</span><span class="n">total_seconds</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="mf">215.0</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="实例属性-3">实例属性</h4>
<p><code>timedelta</code> 只通过 <code>days</code> 、<code>seconds</code>,<code>microseconds</code> 这 3 种单位进行组合来保存时间间隔,可通过对应属性获取数值。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d1</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">minutes</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">seconds</span><span class="o">=</span><span class="mi">35</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d1</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">seconds</span><span class="o">=</span><span class="mi">215</span><span class="p">,</span> <span class="n">microseconds</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d2</span> <span class="o">=</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d2</span>
</span></span><span class="line"><span class="cl"><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">>>></span> <span class="n">d2</span><span class="o">.</span><span class="n">seconds</span>
</span></span><span class="line"><span class="cl"><span class="mi">0</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="总结对比">总结对比</h2>
<h3 id="time-与-datetime-模块的区别"><code>time</code> 与 <code>datetime</code> 模块的区别:</h3>
<ul>
<li><code>time</code> 模块,获取系统时间戳,主要用于计时或表示某一时间点,可以通过数值元祖表示结构化的日期时间,但不支持进一步的转换或操作。</li>
<li><code>datetime</code> 模块,基于时间戳构建高阶的日期、时间、间隔等对象,支持丰富的转换方式和操作。</li>
</ul>
<h3 id="datetime-模块中不同对象的区别"><code>datetime</code> 模块中不同对象的区别:</h3>
<ul>
<li><code>date</code> 只表示日期。支持与 <code>date</code> 或 <code>timedelta</code> 进行加减操作.</li>
<li><code>time</code> 只表示时分。不支持与 <code>time</code> 或 <code>timedelta</code> 进行加减操作,计算间隔需要先转换成 <code>datetime</code> 对象。</li>
<li><code>datetime</code> 同时表示日期和时分的时间对象。同时具备 <code>date</code> 和 <code>time</code> 对象的行为和属性,可以从中解析出单独的 <code>date</code> 和 <code>time</code> 对象。</li>
<li><code>timedelta</code> 表示两个时间之间的间隔。只通过 <code>days</code> 、<code>seconds</code>,<code>microseconds</code> 这 3 种单位来表示。</li>
</ul>
<h3 id="字符串格式化与解析">字符串格式化与解析</h3>
<p>字符串格式化与解析:</p>
<ul>
<li>
<p><code>time.struct_time</code>、<code>datetime.date</code>、<code>datetime.time</code>、<code>datetime.datetime</code> 等对象都可以通过 <code>strftime()</code> (string format)实例方法或函数转换为指定格式的字符串。</p>
</li>
<li>
<p>特定格式的字符串仅可以通过 <code>strptime()</code>(string parse)类方法或函数直接转换为<code>time.struct_time</code>、<code>datetime.datetime</code> 对象。</p>
</li>
</ul>
<p>ISO 格式字符串格式化与解析:</p>
<ul>
<li>
<p><code>datetime.date</code>、<code>datetime.time</code>、<code>datetime.datetime</code> 等对象都可以通过 <code>isoformat()</code> 实例方法转换为 ISO 8601 格式的字符串。</p>
</li>
<li>
<p>ISO 8601 格式的字符串可以通过 <code>fromisoformat()</code> 类方法直接转换为<code>datetime.date</code>、<code>datetime.time</code>、<code>datetime.datetime</code> 对象。</p>
</li>
</ul>
<h3 id="图表">图表</h3>
<p>用一张<a href="http://www.plantuml.com/plantuml/png/hLHDhzCm4BpxLrYFIoALSgzKzCI52pUELVNan4uRYEF8NYFuzzYhr67fAlZ0RJzcnfl9sgy1b8Te9t4VjP63Sz2vds99nR4V5pM3XD6QXBAB4AabNt8khTDnCY_o2NaCu6CFRpaMPjOoSLQYLc08-TsNyNQ7pzwOcUWyWCSSy1sKPpjhiCFJPWBrrsnVmO_pxJ7IfobIVW1FyZ6umNchu2rtYjJb_SVDhfCi9pQj4EVprfAzctyO3_9y5biHoTJ1LMDolPfGw0BXsbPnRfOI24OoWzhlI0ZG2d80jVP4q-FWdIte1aAxmyNfdakC1i4m0xlkst5Zj0SiHEYt6ZgUowQ7F-ocognzHHpYCfc66QQ6HcOgKbIhsg3UsMwSJPCB1pow5MIb_uyI1fmQVXn6pR_Wn0lsavdBU98XTk1L3rBD3kx68sZzVUAPm4oejFvGLBfVKl4IQr0_I25K3uC1Fn2HmWqDu2K-9Vb4BHVbWqbxojxOb9xAuWtexs3XSaYDA_ql1PwF8cYwE5Ku3FQn8gNihIYL1S4fIECcohL5IkNQ4W7au_Mcpp1duxCf6wLyIYarZ3crU0pgE8BqcLKk3-l6Ii1sXqTzmxHUW3UVux-QMKSx_GO0">时序图</a>总结上文内容:</p>
<p><img src="datetime-sequence.png" alt="datetime-sequence"></p>
<ul>
<li><code>[ts]</code> 表示该参数具有默认值是可选的。</li>
<li>请注意区分图中的实例方法、类方法以及模块函数:
<ul>
<li>名称中以 <code>time.</code> 开头的均为 <code>time</code> 模块的函数</li>
<li>名称中以 <code>obj.</code> 开头的均为 <code>date</code>、<code>time</code> 或 <code>datetime</code> 对象的实例方法</li>
<li>其余名称的函数均为类方法</li>
</ul>
</li>
</ul>