在Python中获取系统的时区信息?

时间:2009-07-10 17:59:28

标签: python datetime

我想从Python获取系统的默认时区(PST)。最好的方法是什么?我想避免分支另一个过程。

9 个答案:

答案 0 :(得分:83)

这应该有效:

import time
time.tzname

time.tzname返回两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。

示例返回:('MST', 'MDT')

答案 1 :(得分:22)

给出了像ThomasH的回答中的UTC偏移,但考虑了夏令时。

>>> import time
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
>>> offset / 60 / 60 * -1
-9

time.timezonetime.altzone的值以UTC为单位的秒数(UTC以东的区域为负值)。这与我们实际喜欢它的方式相反,因此* -1。

如果夏令时目前没有生效,那么

time.localtime().tm_isdst将为零(尽管如果某个地区最近更改了其夏令时法,这可能不正确)。

编辑:marr75是正确的,我已经相应编辑了答案。

答案 2 :(得分:14)

查看Python Time模块。

from time import gmtime, strftime
print(strftime("%z", gmtime()))

太平洋标准时间

答案 3 :(得分:10)

用于计算偏移量的代码段不正确,请参阅http://bugs.python.org/issue7229

处理此问题的正确方法是:

def local_time_offset(t=None):
    """Return offset of local zone from GMT, either at present or at time t."""
    # python2.3 localtime() can't take None
    if t is None:
        t = time.time()

    if time.localtime(t).tm_isdst and time.daylight:
        return -time.altzone
    else:
        return -time.timezone

这很有可能,不是OP提出的确切问题,但页面上有两个不正确的片段,时间错误很难追踪和修复。

答案 4 :(得分:4)

我发现这很好用:

import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()

对我来说,这能够区分夏令时与否。

https://stackoverflow.com/a/39079819/4549682

答案 5 :(得分:3)

如果您更喜欢UTC偏移字符串:

time.timezone / -(60*60)

答案 6 :(得分:2)

要获取datetime.tzinfo对象形式的时区信息,请使用dateutil.tz.tzlocal()

from dateutil import tz
myTimeZone = tz.tzlocal()

该对象可以在datetime.datetime.now()tz参数中使用:

from datetime import datetime
from dateutil import tz
localisedDatetime = datetime.now(tz = tz.tzlocal())

datetime.datetime.astimezone()tz对象的datetime参数:

from datetime import datetime
from dateutil import tz
unlocalisedDatetime = datetime.now()
localisedDatetime = unlocalisedDatetime.astimezone(tz = tz.tzlocal())

答案 7 :(得分:1)

从UTC得到的偏移量为timedelta

from datetime import datetime, timezone

now = datetime.now()
now.replace(tzinfo=timezone.utc) - now.astimezone(timezone.utc)

或者这样(比较晦涩,但也可以):

datetime.now(timezone.utc).astimezone().tzinfo.utcoffset(None)

两个解决方案都给出相同的结果。例如:datetime.timedelta(seconds=7200)

答案 8 :(得分:1)

对于Python 3.6+,可以通过以下代码轻松实现:

import datetime
local_timezone = datetime.datetime.utcnow().astimezone().tzinfo

print(local_timezone)

但是对于Python <3.6,在朴素的日期时间调用astimezone()无效。因此,我们必须以一种略有不同的方式来做到这一点。

对于Python 3.x,

import datetime
local_timezone = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo

print(local_timezone)

样本输出:
在荷兰服务器(Python 3.6.9)上: CEST
在孟加拉国服务器(Python 3.8.2)上: +06

可以在此thread上找到更多详细信息。