在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】:我认为使用pytz
或pandas
是不可能的,但您始终可以安装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_gmtoff
和tm_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烧瓶中获取具有本地时区的模板文件的修改日期