用Python获取系统的时区信息?

用Python获取系统的时区信息?,python,datetime,Python,Datetime,我想从Python中获取系统的默认时区(PST)。最好的方法是什么?我希望避免分叉另一个进程。查看Python模块 太平洋标准时间这应该可以: import time time.tzname time.tzname返回两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称 返回示例:('MST','MDT')给出了与ThomasH的答案类似的UTC偏移量,但考虑了夏令时 >>> import time >>> offset = tim

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

查看Python模块

太平洋标准时间这应该可以:

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


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

给出了与ThomasH的答案类似的UTC偏移量,但考虑了夏令时

>>> import time
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
>>> offset / 60 / 60 * -1
-9
time.timezone
time.altzone
的值在UTC以西以秒为单位(UTC以东的区域获得负值)。这与我们实际想要的相反,因此是*-1

如果夏时制当前未生效,
time.localtime().tm_isdst
将为零(尽管如果某个地区最近更改了夏时制法律,这可能不正确)


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

用于计算偏移量的代码段不正确,请参阅

正确的处理方法是:

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提出的确切问题,但页面上有两个错误片段,时间bug很难追踪和修复。

我发现这很有效:

import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()
对我来说,这能够区分夏令时和非夏令时


更详细的参考信息:

要获取对象形式的时区信息,请使用:

从dateutil导入
myTimeZone=tz.tzlocal()
此对象可用于以下的
tz
参数:

从日期时间导入日期时间
从dateutil导入
LocalizedDateTime=datetime.now(tz=tz.tzlocal())
datetime
对象的
tz
参数,通过:

从日期时间导入日期时间
从dateutil导入
unlocalisedDatetime=datetime.now()
localisedDatetime=unlocalisedDatetime.astimezone(tz=tz.tzlocal())

将UTC的偏移量设置为
timedelta

从日期时间导入日期时间,时区
now=datetime.now()
now.replace(tzinfo=timezone.utc)-now.astimezone(timezone.utc)
或者像这样(更晦涩但也有效):

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

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

对于Python3.6+,这可以通过以下代码轻松实现:

导入日期时间
本地时区=datetime.datetime.utcnow().astimezone().tzinfo
打印(本地时区)
但是Python<3.6在naive datetime上调用
astimezone()
是行不通的。所以我们必须用稍微不同的方式来做

对于Python3.x

导入日期时间
local_timezone=datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
打印(本地时区)
示例输出:
在荷兰服务器(Python 3.6.9)上:
CEST

在孟加拉国服务器(Python 3.8.2)上:
+06


更多细节可以在这里找到。

但是产生不同的输出。>>>从时间导入gmtime,strftime>>>打印strftime('%z',gmtime())太平洋标准时间>>>打印strftime('%z',gmtime())太平洋标准时间我不同意。在我的机器上,它们产生不同的输出;2.文档中没有提到任何关于小写字母z的内容,因为只有大写字母z是有效的文字,并且不应该使用小写字母。下面是小写字母z产生的一些细节(即使是在时间模块中)。也请查看,这有助于解决此问题z(和%z)生成非标准的、不明确的、依赖于平台的字符串,这些字符串不是很有用。在Linux上的Python 2.7中,
%z
生成TZ首字母缩写词,例如
%CET
,而
%z
生成偏移量,例如
+0100
要进一步说明这一点,可以使用
time.tzname[time.daylight]
获取当前时区的名称,考虑夏令时。同样,“time.daylight”并不表示DST处于活动状态。它仅指示时区是否观察到DST。您正在查找“time.localtime().tm_isdst”。仅为Windows用户添加,如果本地时区过去有不同的缩写,则时区的值在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TimeZones”中定义(Python使用1月、7月或当前(import/
tzset()
time)的值)价值)
tzlocal
模块可用于获取给定日期的正确tzname。是否有方法获取名称?和亚洲/德黑兰一样,为了安全起见,我认为偏移检查应该颠倒(如果dst=1,则为altzone,否则为else时区)。如果DST状态未知,
tm_isdst
将为
-1
,在这种情况下,当前代码将默认为
altzone
。对于不使用DST的地区,此值永远都不正确,因此
时区
可能应该是回退。(我不确定
-1
是否确实可能从
localtime
输出)1。如果您知道
tm_isdst
;您不需要检查日光。这在python 2.6和3.6上都适用。还需要注意的是,偏移量以秒为单位。
import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()