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


Answers:


23

查看Python时间模块。

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

太平洋标准时间


9
但是产生不同的输出
SilentGhost

4
>>>从时间导入gmtime,strftime >>> print strftime('%z',gmtime())太平洋标准时间>>> print strftime('%Z',gmtime())太平洋标准时间我不同意。
小贩

1
好吧1.在我的机器上,它们产生不同的输出;2.文档未提及小写字母z,因为只有大写字母Z是有效的文字,并且不应使用小写字母。docs.python.org/library/datetime.html#strftime-behavior此处是小写z产生的一些细节(即使在时间模块中)。
SilentGhost

3
还请检查dateutiltzlocal对此有帮助。%z(和%Z)生成的非标准,含糊的平台相关字符串不是很有用。
Lennart Regebro

5
在Linux上的Python 2.7中,%Z产生TZ的缩写,例如。CET,而%z产生偏移,例如。+0100
vartec

110

这应该工作:

import time
time.tzname

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

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


35
为了更进一步,您可以使用time.tzname[time.daylight]获取当前时区的名称,并考虑夏令时。
丹·布雷恩

24
同样,“ time.daylight”并不表示DST处于活动状态。它仅指示时区是否观察到DST。您正在寻找“ time.localtime()。tm_isdst”。
2013年

1
只是为Windows用户添加,时区的值已在“ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones”中定义
swdev 2014年

5
time.tzname如果本地时区过去使用不同的缩写,则可能返回错误的值(Python使用1月,7月的值或当前(导入/tzset()时间)值)。tzlocal模块可以用于获取给定日期的正确tzname。
jfs 2015年

4
有没有办法获得名字?像亚洲/德黑兰?
senaps

32

像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是正确的,我已经相应地编辑了答案。


2
为了安全起见,我认为应将偏移量检查取反(如果dst = 1,则为altzone,否则为时区)。如果DST状态未知,tm_isdst将为-1altzone在这种情况下,当前代码默认为。对于不使用DST的区域,此值永远不会正确,因此timezone应该是备用。(我不确定是否-1确实可以从中输出localtime
nmclean 2014年



11

用于计算偏移量的代码段不正确,请参见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提出的确切问题,但是页面上有两个不正确的摘要,并且时间错误很容易被跟踪和修复。


1.如果你知道tm_isdst; 您无需检查daylight2。在某些altzonetimezone
极端

这对python 2.6和3.6都适用。同样重要的是要注意偏移量以单位
塞斯·约翰逊

2

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

from dateutil import tz
myTimeZone = tz.tzlocal()

该对象可用于tz参数datetime.datetime.now()

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

或object的tz参数datetime通过datetime.datetime.astimezone()

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

2

对于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

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


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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.