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

2w2cym1i  于 2023-01-16  发布在  Python
关注(0)|答案(9)|浏览(187)

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

yi0zb3m4

yi0zb3m41#

这应该行得通:

import time
time.tzname

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

gev0vcfq

gev0vcfq2#

提供了一个UTC偏移,如ThomasH的答案,但将夏令时考虑在内。

>>> 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将为零(尽管如果某个地区最近更改了其夏令时法律,则这可能不正确)。
编辑:marr 75是正确的,我已经相应地编辑了答案。

piztneat

piztneat3#

我发现这个很好用:

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

对我来说,这是能够区分夏令时和不。
在Python 3.6中,你可以:

tz_string = datetime.datetime.now().astimezone().tzname()

或者

tz_string = datetime.datetime.now().astimezone().tzinfo

更多详细信息请参考:https://stackoverflow.com/a/39079819/4549682

ryevplcw

ryevplcw4#

查看Python Time模块。

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

太平洋标准时间

g52tjvyc

g52tjvyc5#

用于计算偏移的代码片段不正确,请参见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

这是在所有的可能性,而不是确切的问题,操作员问,但有两个不正确的片段在页面上和时间错误吸跟踪和修复。

pinkon5k

pinkon5k6#

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

x8goxv8g

x8goxv8g7#

要获取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()调用datetime对象的tz参数:

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

inkz8wg98#

获取与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)

zwghvu4y

zwghvu4y9#

import tzlocal
tz_info = tzlocal.get_localzone() # 'US/Central' or 'Asia/Calcutta'
dt = datetime.now()        # 2023-01-15 15:17:24.412430
print(tz_info.localize(dt) # 2023-01-15 15:17:24.412430-06:00

使用tzlocal,我们将能够获得本地时区。

相关问题