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

Jos*_*son 61 python datetime

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

Joh*_*iss 91

这应该工作:

import time
time.tzname
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为了更进一步,您可以使用`time.tzname [time.daylight]`来获取当前时区的名称,以计算夏令时. (32认同)
  • 同样,'time.daylight'并不表示DST处于活动状态.它仅表示时区是否观察到DST.您正在寻找'time.localtime().tm_isdst'. (19认同)
  • [`time.tzname`可能返回错误的值](http://bugs.python.org/issue22798)如果当地时区过去有不同的缩写(Python使用1月,7月或当前的值(导入/` tzset()`time)value).`tzlocal`模块可用于获取给定日期的正确tzname. (5认同)
  • 有没有办法得到这个名字?像亚洲/德黑兰? (4认同)

Dea*_*ean 25

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

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

time.timezonetime.altzone以秒为UTC的西(与UTC的区域东得到一个负值).这与我们实际喜欢它的方式相反,因此*-1.

time.localtime().tm_isdst 如果夏令时目前没有生效,那么它将为零(尽管如果某个地区最近改变了他们的夏令时法则,这可能不正确).

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

  • 为安全起见,我认为应该反转偏移检查(altzone if dst = 1 else timezone)。如果 DST 状态不知何故,`tm_isdst` 将是 `-1`,在这种情况下,当前代码将默认为 `altzone`。对于不使用 DST 的区域,这个值永远不会正确,所以 `timezone` 应该是后备。(虽然我不确定 `-1` 是否真的可以从 `localtime` 输出) (2认同)
  • [所有altzone,基于时区的解决方案在某些极端情况下可能会失败](http://bugs.python.org/issue1647654) (2认同)

aha*_*ker 17

查看Python 时间模块.

from time import gmtime, strftime
print(strftime("%z", gmtime()))
Run Code Online (Sandbox Code Playgroud)

太平洋标准时间

  • 是的,但**大写**`Z`和**小写**`z`不是. (13认同)
  • **但产生不同的输出**. (7认同)
  • 在Linux上的Python 2.7中,`%Z`产生TZ首字母缩略词,例如.`CET`,而`%z`产生偏移,例如.`+ 0100` (5认同)
  • 另请查看[dateutil](https://pypi.python.org/pypi/python-dateutil)和[tzlocal](https://pypi.python.org/pypi/tzlocal).%z(和%Z)产生非标准的,模糊的平台相关字符串,这些字符串不是很有用. (3认同)
  • >>>从时间导入gmtime,strftime >>> print strftime('%z',gmtime())太平洋标准时间>>> print strftime('%Z',gmtime())太平洋标准时间我不同意. (2认同)
  • 这在 Python 2 中给了我错误的时区(再次,GMT),但在 Python 3 中给出了正确的时区。 (2认同)
  • 这是不正确的,GMT 给出的是 gmt 时间,你应该使用 `localtime` (2认同)

Imt*_*que 12

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

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

print(local_timezone)
Run Code Online (Sandbox Code Playgroud)

但是对于 Python < 3.6 来说,调用astimezone()简单的日期时间是行不通的。所以我们必须以稍微不同的方式来做。

所以对于 Python 3.x,

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

print(local_timezone)
Run Code Online (Sandbox Code Playgroud)

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

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


mar*_*r75 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
Run Code Online (Sandbox Code Playgroud)

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


wor*_*ise 9

我发现这很好用:

import datetime
tz_string = datetime.datetime.now(datetime.timezone.utc).astimezone().tzname()
Run Code Online (Sandbox Code Playgroud)

对我而言,这能够区分夏令时与否。

/sf/answers/2735587361/