<p>从Python 3.7开始,<code>datetime.datetime.fromisoformat()</code>可以处理您的格式:</p>
<pre><code>>>> import datetime
>>> datetime.datetime.fromisoformat('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))
</code></pre>
<p>在较旧的Python版本中,如果没有大量的人工时区定义,就不能这样做。</p>
<p>Python不包括时区数据库,因为它会很快过时。相反,Python依赖外部库来为您提供正确配置的时区,外部库的发布周期要快得多。</p>
<p>作为副作用,这意味着时区<em>解析</em>也需要是一个外部库。如果<code>dateutil</code>对您来说太重,请改用<a href="https://pypi.python.org/pypi/iso8601/" rel="noreferrer">^{<cd3>}</a>,它将很好地解析您的特定格式:</p>
<pre><code>>>> import iso8601
>>> iso8601.parse_date('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset '-04:00'>)
</code></pre>
<p><code>iso8601</code>非常小。比较一下<code>python-dateutil</code>的148KB。</p>
<p>从Python 3.2开始,Python<em>可以处理简单的基于偏移量的时区,并且<code>%z</code>将解析时间戳中的<code>-hhmm</code>和<code>+hhmm</code>时区偏移量。这意味着对于ISO 8601时间戳,您必须删除时区中的<code>:</code>:</p>
<pre><code>>>> from datetime import datetime
>>> iso_ts = '2012-11-01T04:16:13-04:00'
>>> datetime.strptime(''.join(iso_ts.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))
</code></pre>
<p>在<a href="http://bugs.python.org/issue15873" rel="noreferrer">Python issue 15873</a>中正在跟踪缺少正确的ISO 8601解析。</p>