【问题标题】:Get system local timezone in python在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 python-2.7 pandas timezone-offset pytz


【解决方案1】:

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

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 herereason 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"]);我猜默认情况下不使用外壳,因此在单个字符串中包含参数只会让函数查找失败的同名文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多