【问题标题】:Get time zone information of the system in Python?在Python中获取系统的时区信息?
【发布时间】:2010-11-09 19:26:33
【问题描述】:

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

【问题讨论】:

标签: python datetime


【解决方案1】:

这应该可行:

import time
time.tzname

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

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

【讨论】:

  • 为了更进一步,您可以使用time.tzname[time.daylight] 获取当前时区的名称,考虑夏令时。
  • 同样,'time.daylight' 并不表示 DST 处于活动状态。它仅指示时区是否遵守 DST。您正在寻找 'time.localtime().tm_isdst'。
  • 只是为 Windows 用户添加,时区的值是在 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones` 中定义的
  • time.tzname may return a wrong value 如果本地时区过去有不同的缩写(Python 使用 1 月、7 月的值或当前 (import/tzset() time) 值)。 tzlocal 模块可用于获取给定日期的正确 tzname。
  • 有没有办法得到名字?像亚洲/德黑兰?
【解决方案2】:

像 ThomasH 的回答一样给出 UTC 偏移量,但考虑到夏令时。

>>> 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 将为零(尽管如果某个地区最近更改了夏令时法,这可能不正确)。

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

【讨论】:

  • 为了安全起见,我认为偏移量检查应该被反转(altzone if dst = 1 else timezone)。如果 DST 状态未知,tm_isdst 将是 -1,在这种情况下,当前代码将默认为 altzone。对于不使用 DST 的区域,此值永远不会正确,因此 timezone 可能应该是后备。 (我不确定-1 是否真的可以从localtime 输出)
【解决方案3】:

查看 Python Time 模块。

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

太平洋标准时间

【讨论】:

  • 但产生不同的输出
  • >>> from time import gmtime, strftime >>> print strftime('%z', gmtime()) 太平洋标准时间 >>> print strftime('%Z', gmtime())太平洋标准时间我不同意。
  • 还可以查看dateutiltzlocal,这有助于解决此问题。 %z(和 %Z)生成非标准的、模棱两可的平台相关字符串,这些字符串不是很有用。
  • 在 Linux 上的 Python 2.7 中,%Z 产生 TZ 首字母缩写词,例如。 CET,而%z 产生偏移量,例如。 +0100
  • 这在 Python 2 中给了我错误的时区(又是 GMT),但在 Python 3 中给了我正确的时区。
【解决方案4】:

我发现这很好用:

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

对我来说,这可以区分夏令时与否。

更详细的参考:https://stackoverflow.com/a/39079819/4549682

【讨论】:

    【解决方案5】:

    计算偏移量的代码sn-ps不正确,见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
    

    这很可能不是 OP 提出的确切问题,但页面上有两个不正确的 sn-ps 并且时间错误很难追踪和修复。

    【讨论】:

    【解决方案6】:

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

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

    但是对于 Python 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找到。

    【讨论】:

      【解决方案7】:

      从 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)

      【讨论】:

        【解决方案8】:

        要以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对象的tz参数通过datetime.datetime.astimezone()

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

        【讨论】:

          猜你喜欢
          • 2016-05-05
          • 2018-06-07
          • 2014-06-12
          • 2011-03-07
          • 1970-01-01
          • 2016-03-12
          • 2011-06-02
          • 1970-01-01
          • 2011-03-28
          相关资源
          最近更新 更多