擅长:python、mysql、java
<p>这里有一个不依赖于任何外部库的弹性方法:</p>
<pre><code>from datetime import datetime
import time
def datetime_from_utc_to_local(utc_datetime):
now_timestamp = time.time()
offset = datetime.fromtimestamp(now_timestamp) - datetime.utcfromtimestamp(now_timestamp)
return utc_datetime + offset
</code></pre>
<p>这避免了DelboyJay例子中的时间问题。还有埃里克·范·奥斯滕修正案中较少的时间问题。</p>
<p>作为一个有趣的脚注,上面计算的时区偏移量可能不同于以下看似等效的表达式,这可能是由于夏令时规则的更改:</p>
<pre><code>offset = datetime.fromtimestamp(0) - datetime.utcfromtimestamp(0) # NO!
</code></pre>
<p><strong>更新:</strong>此代码段存在使用当前时间的UTC偏移量的弱点,该偏移量可能不同于输入日期时间的UTC偏移量。有关另一个解决方案,请参见对此答案的评论。</p>
<p>为了避开不同的时间,从过去的时间中获取纪元时间。我做的是:</p>
<pre><code>def utc2local (utc):
epoch = time.mktime(utc.timetuple())
offset = datetime.fromtimestamp (epoch) - datetime.utcfromtimestamp (epoch)
return utc + offset
</code></pre>