<p><a href="https://github.com/regebro/tzlocal" rel="noreferrer">^{<cd1>} module</a>返回与本地时区对应的pytz tzinfo对象:</p>
<pre><code>import time
from datetime import datetime
import pytz # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal
# get local timezone
local_tz = get_localzone()
# test it
# utc_now, now = datetime.utcnow(), datetime.now()
ts = time.time()
utc_now, now = datetime.utcfromtimestamp(ts), datetime.fromtimestamp(ts)
local_now = utc_now.replace(tzinfo=pytz.utc).astimezone(local_tz) # utc -> local
assert local_now.replace(tzinfo=None) == now
</code></pre>
<p>即使在夏令时转换期间,当本地时间可能不明确时,它也能工作。</p>
<p><code>local_tz</code>也适用于过去的日期,即使当时本地时区的utc偏移量不同。^基于{<cd3>}的解决方案在这种情况下失败,例如在欧洲/莫斯科时区(2013年起的示例):</p>
<pre><code>>>> import os, time
>>> os.environ['TZ'] = 'Europe/Moscow'
>>> time.tzset()
>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> from tzlocal import get_localzone
>>> dateutil_tz = tzlocal()
>>> tzlocal_tz = get_localzone()
>>> datetime.fromtimestamp(0, dateutil_tz)
datetime.datetime(1970, 1, 1, 4, 0, tzinfo=tzlocal())
>>> datetime.fromtimestamp(0, tzlocal_tz)
datetime.datetime(1970, 1, 1, 3, 0, tzinfo=<DstTzInfo 'Europe/Moscow' MSK+3:00:00 STD>)
</code></pre>
<p>dateutil返回<strong>错误的</strong>UTC+4偏移量,而不是1970-01-01的正确的UTC+3。</p>
<p><em>对于那些在2017年遇到这种情况的人来说,{<cd3>}仍然是破碎的。上面的例子现在可以工作了,因为当前的utf偏移量在莫斯科是UTC+3(意外地等于1970年的UTC偏移量)。为了演示错误,我们可以选择utc偏移量为utc+4的日期:</p>
<pre><code>>>> import os, time
>>> os.environ['TZ'] = 'Europe/Moscow'
>>> time.tzset()
>>> from datetime import datetime
>>> from dateutil.tz import tzlocal
>>> from tzlocal import get_localzone
>>> dateutil_tz = tzlocal()
>>> tzlocal_tz = get_localzone()
>>> ts = datetime(2014, 6,1).timestamp() # get date in 2014 when gmtoff=14400 in Moscow
>>> datetime.fromtimestamp(ts, dateutil_tz)
datetime.datetime(2014, 5, 31, 23, 0, tzinfo=tzlocal())
>>> datetime.fromtimestamp(ts, tzlocal_tz)
datetime.datetime(2014, 6, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Moscow' MSK+4:00:00 STD>)
</code></pre>
<p>dateutil在2014-06-01返回<strong>错误的<strong>UTC+3偏移量,而不是正确的UTC+4。</p>