如何自动获取当地时区的时区偏移量?

11 python time timezone datetime

我试图自动获取本地时区偏移但是遇到了麻烦.我试过了:

print time.timezone/3600
Run Code Online (Sandbox Code Playgroud)

这会得到(当前错误的)偏移,因为它不会自动调整夏令时和非夏令时.

我也尝试过:

now_utc = pytz.utc.localize(datetime.datetime.now())
now_mst = now_utc.astimezone(pytz.timezone('US/Mountain'))
Run Code Online (Sandbox Code Playgroud)

这会得到正确的偏移值,但我想自动设置'US/Mountain'部分,所以我不必手动输入任何东西来获得偏移量.

有没有办法获得正确的偏移量,可以自动调整DST和非DST?

我将在不同地理位置的多台服务器上运行此脚本,如果可以,我想自动获取tz偏移量.

jte*_*ace 16

您可以使用dateutil模块.要立即获取当地时区:

>>> import dateutil.tz
>>> import datetime
>>> localtz = dateutil.tz.tzlocal()
>>> localtz.tzname(datetime.datetime.now(localtz))
'EDT'
Run Code Online (Sandbox Code Playgroud)

我目前正在东部夏令时间.在夏令时切换回来之后,您可以看到它将来会改回EST:

>>> localtz.tzname(datetime.datetime.now(localtz) +
                   datetime.timedelta(weeks=20))
'EST'
Run Code Online (Sandbox Code Playgroud)

如果您想要UTC的偏移量,可以使用utcoffset函数.它返回timedelta:

>>> localtz.utcoffset(datetime.datetime.now(localtz))
datetime.timedelta(-1, 72000)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,因为我是UTC-4,它返回-1天+20小时.如果您需要,可以将其转换为小时数:

>>> localoffset = localtz.utcoffset(datetime.datetime.now(localtz))
>>> localoffset.total_seconds() / 3600
-4.0
Run Code Online (Sandbox Code Playgroud)