在python中获取系统本地时区

Posted

技术标签:

【中文标题】在python中获取系统本地时区【英文标题】:Get system local timezone in python 【发布时间】:2016-05-05 14:54:05 【问题描述】:

看起来很奇怪,但我找不到在 Python 中使用 Pandas/pytz 查找本地时区的简单方法。

我能做到:

>>> pd.Timestamp('now', tz='utc').isoformat()
Out[47]: '2016-01-28T09:36:35.604000+00:00'
>>> pd.Timestamp('now').isoformat()
Out[48]: '2016-01-28T10:36:41.830000'
>>> pd.Timestamp('now').tz_localize('utc') - pd.Timestamp('now', tz='utc')
Out[49]: Timedelta('0 days 01:00:00')

这会给我时区,但这可能不是最好的方法...... pytz 或 pandas 中是否有获取系统时区的命令? (最好在 python 2.7 中)

【问题讨论】:

相关的,如果不是被骗的话:Python: Figure out local timezone fuxking python 没有内置的方法来做到这一点。 【参考方案1】:

我认为使用pytzpandas 是不可能的,但您始终可以安装python-dateutil 或tzlocal:

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

from tzlocal import get_localzone
local_tz = get_localzone()

【讨论】:

如果你想要实际的时区名称,作为一个字符串,你可以使用datetime.now(tzlocal()).tzname()。它将输出一个三个字母的时区代码。例如,MST 表示山地时间。【参考方案2】:

time.timezone 应该可以工作。

本地(非 DST)时区的偏移量,以 UTC 以西的秒数为单位 (西欧大部分地区为负,美国为正,美国为零 英国)。

除以 3600 会得到以小时为单位的偏移量:

import time

print(time.timezone / 3600.0)

这不需要任何额外的 Python 库。

【讨论】:

这没有考虑夏令时。 正确,这给出了非 DST 本地时区。如果您需要知道 DST 是否处于活动状态,您可以使用 time.localtime( ).tm_isdst > 0【参考方案3】:

我发现在很多情况下这是可行的:(自 Python 3.6 起)

from datetime import datetime

# use this extension and it adds the timezone
tznow = datetime.now().astimezone()
print(tznow.isoformat())
2020-11-05T06:56:38.514560-08:00

# It shows that it does have a valid timezone
type(tznow.tzinfo)
<class 'datetime.timezone'>

我觉得这很方便,因为它不依赖于外部包。它似乎只适用于 Python3(但不适用于 Python2)

【讨论】:

【参考方案4】:

time 模块涵盖了操作系统级别的相当多与语言环境时间相关的设置

import time

# Since Python 3.3
local_time = time.localtime()         # returns a `time.struct_time`
tzname_local = local_time.tm_zone     # 'EST'
dst = local_time.tm_isdst             # _from docs_: may be set to 1 when daylight savings time is in effect, 
                                      # and 0 when it is not. A value of -1 indicates that this is not known, 
                                      # and will usually result in the correct state being filled in.

tm_gmtofftm_zone 属性在具有支持 struct tm 中相应字段的 C 库的平台上可用。 见:https://docs.python.org/3/library/time.html#time.struct_time

# At least from Python 2.7.18
local_tzname = time.tzname            # 'EST'

两个字符串的元组:第一个是本地非 DST 时区的名称,第二个是本地 DST 时区的名称。如果未定义 DST 时区,则不应使用第二个字符串。 见:https://docs.python.org/2.7/library/time.html#time.tzname)

另一个技巧是使用datetime.now().astimezone() 作为found here 和reason why it fails on python 2.x

from datetime import datetime

# Python 3 will return a datetime with local timezone,
local_now = datetime.now().astimezone()    

# Doesn't work on python 2.x 
# datetime.now().astimezone()                -> TypeError: Required argument 'tz' (pos 1) not found
# datetime.now().astimezone(dateutil.tz.UTC) -> ValueError: astimezone() cannot be applied to a naive datetime

local_tz = local_now.tzinfo  # datetime.timezone
local_tzname = local_tz.tzname(local_now)
print(local_tzname) 

【讨论】:

【参考方案5】:

虽然它不使用 pytz/Pandas,但其他答案也没有,所以我想我应该发布我在 mac/linux 上使用的内容:

import subprocess
timezone = subprocess.check_output("date +%Z")

优于其他答案的好处:尊重夏令时,不需要安装额外的库。

【讨论】:

除非指定了输出格式,否则解析外部命令的输出很脆弱,并且如果输出格式发生变化,可能会中断。最好不用解析就使用date +%Z的输出。 生成一个新进程会消耗更多的系统资源。这个答案虽然有效,但应该是 I/O 密集型系统中的最后选择。当然,这是相对的:例如,在服务器端 HTTP 处理程序中进行此子进程调用可能会使您的应用程序对 DDoS 更加敏感。如果你把它放在一个 lambda 中,它也会使调用时间更长并且更昂贵。但是,如果您只是想编写一个不能与 windows 移植的快速脚本,那么这个答案应该是完成它的更快方法。 不确定YMMV是否基于其他版本的Python,但我使用的是3.7.3,这是所需的语法:timezone = subprocess.check_output(["date", "+%Z"]);我猜默认情况下不使用外壳,因此在单个字符串中包含参数只会让函数查找失败的同名文件。

以上是关于在python中获取系统本地时区的主要内容,如果未能解决你的问题,请参考以下文章

如何在python烧瓶中获取具有本地时区的模板文件的修改日期

将其他时区转换为本地时区(偏移量)

Linux内核中获取时间并转换成本地时区时间

给定 UTC 时间戳和 UTC 偏移量,是不是可以在 Python 中获取时区?

如何在c#中获取用户本地机器时区

从时区和 UTC 时间,获取该时间点与本地时间的秒差